我使用推荐的InstanceContextMode.Single服务行为将简单的Windows WCF服务编写为单例,例如:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
我的代码如下所示(已修改:已修订以反映评论者建议的更改)。问题是,如何在我的构造函数中告诉我第一次调用我的服务?也就是说,当单身人士第一次(也是唯一一次)被实例化时?通过调试器进行的广泛测试表明,构造函数永远不会被调用。
我需要在第一次调用服务时进行一些特殊处理,构造函数似乎是合理的地方。但是,我尝试在构造函数中放置一些简单的代码,甚至无法在那里找到断点(使用远程调试)。如果我使用 InstanceContextMode.Single 路由,那么构造函数永远不会被调用(与具有静态类和对象的静态引用的旧经典方法相反,检查在构造函数中引用该对象以查看它是否为空等等。)而且,即使我可以在其中放置功能代码,我也不知道要在构造函数中检查什么。
通过 InstanceContextMode.Single 路线,我是否失去了检查第一个电话的能力?
答案 0 :(得分:0)
我创建了一个简单的WCF服务(在教程here之后使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]。默认构造函数只被调用一次,因为服务被标记为singleton。你可以调用你的方法SpinupQueueMonitor ()来自这个构造函数,可以确保执行一次。
如果这不起作用,请尝试创建一个静态构造函数。静态构造函数只调用一次。请阅读静态构造函数here的文档。我希望这能解决你的问题。
以下是我使用的示例代码:
namespace WcfIis
{
//Even though the behavior is per call the static constructor will be called only once
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1 : IService
{
public Service1()
{
}
static Service1()
{
//SpinupQueueMonitor();
}
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
}
如果您有任何问题,请告诉我。
谢谢你, 索玛。