【问题标题】:How to notify the host of a WCF service when a client connects?客户端连接时如何通知 WCF 服务的主机?
【发布时间】:2011-11-22 11:12:13
【问题描述】:

我有一个由 Windows 服务托管的 WCF 服务。当客户端连接到 WCF 服务时,我不知道如何通知 Windows 服务。基本上我在windows服务中启动WCF服务的只有这个:

private ServiceHost sHost;
WCF.WCFService wcfService = new WCF.WCFService();
sHost = new ServiceHost(wcfService);
sHost.Open();

我可以使用 wcfService 对象通过 Windows 服务调用 WCF 服务中的方法。当客户端连接到 WCF 服务时,是否有某种方法可以触发某种事件?

【问题讨论】:

    标签: c# .net wcf windows-services


    【解决方案1】:

    服务作为根据ServiceBehaviourAttribute 属性InstanceContextMode 实例化的对象运行

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class MyService : IMyService
    { 
        // ...
    

    InstanceContextMode 的值为

    • Single - 为所有会话和调用运行单个服务实例
    • PerSession - 为每个会话(即每个客户端)运行一个服务实例
    • PerCall - 每次调用都会实例化一个服务实例,即使来自单个客户端也是如此

    默认值是PerSession,这对大多数场景来说都是有意义的。假设您使用的是PerSession,您可以将您喜欢的任何“连接逻辑”放入服务的构造函数中。

    // you don't need to specify PerSession as it is default, but I have for clarity
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class MyService : IMyService
    { 
        public MyService()
        {
            // constructor will be called for each new client session
            // eg fire an Event, log a new client has connected, etc
        }
        // ...
    }
    

    您需要小心在构造函数中运行代码,因为在构造函数完成之前服务将不可用。如果您想做任何可能需要时间的事情,请触发一个事件或发送一个线程来执行该工作。

    【讨论】:

    • 我不确定我是否完全理解您所说的内容,但在我看来,构造函数中的逻辑不会真正让主机知道新连接。当新服务器启动时,它只是在 WCF 服务中执行逻辑。
    • 你不明白哪一部分?每个新连接都会启动一个新的服务实例,因此每个新连接都会调用服务构造函数。
    • 是的,我明白这一点,但是主机(在我的情况下是 Windows 服务)如何知道连接?构造函数在 WCF 服务中。
    • 我想我明白了 - 你在问事件如何/将如何从服务传播到 Windows 服务?如果这是您的问题,那么您可以使用 eventdelegate
    【解决方案2】:

    我在这里找到了最佳答案:Subscribe to events within a WCF service

    怀疑您可以在 WCF 服务中创建一个可由主机接收的事件处理程序。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      相关资源
      最近更新 更多