WCF - 每个调用对象缓存

时间:2011-08-30 15:42:37

标签: c# wcf

我已经回复了我的问题。

从我的WCF服务的服务器端代码,我想缓存一些变量。这些变量需要在整个服务调用的生命周期中使用。我不希望它们出现在服务逻辑中可能使用的每个方法签名调用中。

如果是Web应用程序,我会使用会话管理,但这是在服务器代码端。如何根据服务调用“缓存”这些值,然后在服务完成时将它们丢弃?

解决方案:

这一点的目的是跟踪哪个服务调用在错误跟踪工具中出错。所以最后我做了以下的事情:

  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;
          }
     } 
}

允许主调用方法捕获所有异常,然后我可以在顶层使用我需要的两个变量。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

可以转到基于会话的模型,但我想这对你想做的事情来说太沉重了。

我还想象您当前每次调用WCF服务时都会传递id。

也就是说,您可以创建一个特定的异常类型,它将在构造函数中使用两个参数。第一个是调用者的id(您将作为属性公开),第二个是将传递给base constructor of the Exception class并通过InnerException property公开的异常。