【问题标题】:How can I determine first call to WCF singleton service?如何确定第一次调用 WCF 单例服务?
【发布时间】:2016-08-23 21:36:11
【问题描述】:

我正在使用推荐的 InstanceContextMode.Single 服务行为编写一个简单的 Windows WCF 服务作为单例,例如:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

我的代码如下所示(已编辑:修改以反映评论者建议的更改)。问题是,我如何从构造函数中得知对我的服务的第一次调用已经完成?也就是说,当单例第一次(也是唯一一次)实例化时?通过调试器进行的大量测试表明构造函数从未被调用过。

我需要在第一次调用服务时进行一些特殊处理,而构造函数似乎是执行此操作的合乎逻辑的地方。但是,我尝试在构造函数中放置一些简单的代码,甚至无法在此处设置断点(使用远程调试)。如果我使用 InstanceContextMode.Single 路由,就好像从未真正调用过构造函数(与具有静态类和对对象的静态引用的旧经典方法相反,检查对它的引用构造函数中的对象以查看它是否为空等)而且,即使我可以在构造函数中放置功能代码,我也不知道要在构造函数中检查什么。

我是否无法通过 InstanceContextMode.Single 路由检查我的第一个呼叫?

【问题讨论】:

  • 很确定 WCF 不会实例化您的服务器实例,直到客户端实际调用您的服务(创建客户端代理还不够)。尝试调用它,看看是否调用了构造函数。
  • 声明一个静态布尔变量并将其初始值设置为 false 并在构造函数中检查值是否为 false,然后仅执行第一次运行逻辑并将该变量设置为 true。这样,您只需运行该逻辑一次。
  • 感谢您的回复。我确实尝试过静态变量路由,试图在构造函数中检查它。但是,即使客户端调用服务,构造函数也不会被调用。我正在上传更完整的代码图片来展示这一点。

标签: wcf design-patterns singleton


【解决方案1】:

我创建了一个简单的 WCF 服务(按照教程 here 使用 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]。默认构造函数只被调用一次,因为服务被标记为单例。你可以调用你的方法 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;
        }
    }
}

如果您有任何问题,请告诉我。

谢谢你, 索玛。

【讨论】:

  • 感谢您抽出宝贵的时间来解决这个问题。我相信,结合我从 Microsoft 收到的回复,您对静态构造函数的回答是正确的路径。你是正确的,静态构造函数只被调用一次。此外,微软表示,对于 ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,正确的行为是永远不会调用构造函数。所以使用 PerCall,或者可能是静态构造函数的老式方法,并查看实例是否null,是更好的调查方法
  • 谢谢。很高兴知道 InstanceContextMode.Single 上的行为。
猜你喜欢
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多