我已经回复了我的问题。
从我的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;
}
}
}
允许主调用方法捕获所有异常,然后我可以在顶层使用我需要的两个变量。
答案 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公开的异常。