如何在客户端连接时通知主机WCF服务?

时间:2011-09-22 02:47:13

标签: c# .net wcf windows-services

我有一个由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服务时触发某种事件吗?

2 个答案:

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

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

答案 1 :(得分:1)

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

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