WCF - แคชออบเจ็กต์ต่อการโทร

ฉันเรียบเรียงคำถามของฉันใหม่แล้ว

จากโค้ดฝั่งเซิร์ฟเวอร์ของบริการ WCF ของฉัน ฉันต้องการแคชตัวแปรบางตัว ตัวแปรเหล่านี้จำเป็นต้องใช้ตลอดวงจรการใช้งานของการเรียกใช้บริการหนึ่งครั้ง ฉันไม่ต้องการให้พวกเขาในทุกการเรียกลายเซ็นวิธีการที่อาจใช้ในตรรกะของบริการ

หากเป็นแอปพลิเคชันบนเว็บ ฉันจะใช้การจัดการเซสชัน แต่นี่อยู่ที่ฝั่งโค้ดเซิร์ฟเวอร์ ฉันจะ 'แคช' ค่าเหล่านี้ต่อการเรียกใช้บริการ แล้วกำจัดทิ้งเมื่อบริการเสร็จสิ้นได้อย่างไร

สารละลาย:

ประเด็นนี้คือเพื่อติดตามว่าการเรียกใช้บริการใดมีข้อผิดพลาดในเครื่องมือติดตามข้อบกพร่อง ดังนั้นในที่สุดฉันก็ทำสิ่งต่อไปนี้:

  public class MyService: IMyService
    {
         public String ServiceLogic(string var1, string var2, string id)
         {
             try{
                    DoingStuff.DoMoreStuff();
             }
             catch(exception ex)
             {
                 var trapper = MyCustomErrorTrap(var1,var2);
                 throw new faultexpection<MyCustomErrorTrap>(trapper);
             }
         }

}



Public static class DoingStuff
{
     public static void DoMoreStuff()
     {
         try{
             if(blah.toString())
             ........
         }
         catch(exception ex)
         {
            throw;
          }
     } 
}

ด้วยการอนุญาตให้วิธีการเรียกหลักดักจับข้อยกเว้นทั้งหมด ฉันจึงสามารถใช้ตัวแปรสองตัวที่ฉันต้องการที่ระดับบนสุดได้


person Omnia9    schedule 30.08.2011    source แหล่งที่มา
comment
ฉันกำลังอ่านคำถามสองข้อที่แตกต่างกันที่นี่: 1) คุณต้องการบันทึกรหัสผู้โทรเมื่อมีข้อผิดพลาด และ 2) คุณมีชุดของค่านอกเหนือจากรหัสผู้โทรที่คุณต้องการเข้าถึงจากทุกที่ใน call stack ของบริการ ฉันถูกไหม?   -  person ErnieL    schedule 30.08.2011
comment
ฉันขอโทษที่ฉันไม่เข้าใจคำถาม คุณช่วยขยายความได้ไหม   -  person oleksii    schedule 31.08.2011


คำตอบ (2)


คำถามของคุณไม่สมเหตุสมผลสำหรับฉันจริงๆ

ตลอดวงจรชีวิตของการโทรบริการหนึ่งครั้ง

"การเรียกบริการ" - หรือการดำเนินการบริการ - เป็นเพียงการเรียกใช้วิธีการภายในบริการ เห็นได้ชัดว่าคุณต้องส่งค่าเมื่อมีการเรียกใช้การดำเนินการ (หรือดึงข้อมูลจากที่ไหนสักแห่ง) ดังนั้นคุณจะมีมันอยู่แล้ว

public class MyService : IMyContract
{
    public void DoSomething(string p1, int p2)
    {
        DoThing(p1);
        DoAnotherThing(p2);
    }
}

เหตุใดจึงต้องแคชพารามิเตอร์? เพียงใช้สิ่งเหล่านี้ภายในบริบทตามที่ต้องการ

หากคุณหมายถึง แคชต่อเซสชัน นั่นก็สมเหตุสมผลมากกว่า วิธีแก้ปัญหานั้นค่อนข้างง่าย:

// decorate your class like this
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyContract
{
    // these fields will persist until the session is closed
    private string _p1;
    private int _p2;

    public void DoSomething(string p1, int p2)
    {
        _p1 = p1;
        _p2 = p2;         
    }

    // check that the _p1 and _p2 values are initialised before use
    public void AnotherServiceOperation()
    {
        DoThing(_p1);
        DoAnotherThing(_p2);
    }
}
person Kirk Broadhurst    schedule 31.08.2011
comment
ฉันพยายามหลีกเลี่ยงบรรทัด DoThing(_P1); เกือบจะเหมือนกับตัวแปรระดับโลก (เกลียด globals แม้ว่า) สิ่งนี้ทำให้ฉันมีความคิด ขอบคุณ. - person Omnia9; 31.08.2011

คุณ สามารถ ไปที่โมเดลตามเซสชัน แต่ฉันคิดว่ามันหนักเกินไปสำหรับสิ่งที่คุณต้องการทำ

ฉันยังจินตนาการด้วยว่าขณะนี้คุณส่ง ID ทุกครั้งที่โทรไปยังบริการ WCF ของคุณ

อย่างไรก็ตาม คุณสามารถสร้างประเภทข้อยกเว้นเฉพาะซึ่งต้องใช้พารามิเตอร์สองตัวในตัวสร้าง อันแรกคือรหัสของผู้เรียก (ซึ่งคุณจะเปิดเผยเป็นคุณสมบัติ) และอันที่สองคือข้อยกเว้นซึ่งจะถูกส่งไปยัง ตัวสร้างพื้นฐานของคลาส Exception และเปิดเผยผ่าน InnerException คุณสมบัติ

person casperOne    schedule 30.08.2011