当客户端连接到 WCF 托管的端点时触发事件

Posted

技术标签:

【中文标题】当客户端连接到 WCF 托管的端点时触发事件【英文标题】:Fire event when client connects to WCF-hosted endpoint 【发布时间】:2010-10-17 05:33:44 【问题描述】:

当新客户端连接到 WCF 托管服务时,我该怎么做才能触发事件?

编辑:我正在寻找的是在创建新会话或为客户创建新频道时获取事件。如:我正在使用的会话关闭:

OperationContext.Current.Channel.Closed += new EventHandler( Channel_Closed );

那么我应该使用什么来启动会话?

【问题讨论】:

【参考方案1】:

我认为您要完成的工作最好通过在创建服务侦听器后添加一个新的channel initializer 来完成。

基本上,您创建一个实现该接口的类,然后将其添加到服务主机。如果您是自托管,这很简单:

public class MyHook : IChannelInitializer

  public void Initialize(IClientChannel channel)
  
    // Do whatever.
  


var host = new ServiceHost(typeof(MyService), MYBASEADDRESS);
host.AddServiceEndpoint(typeof(IMyService), new WSHttpBinding(), MYSERVICEADDRESS);
host.Open();

// There will be one per endpoint; you can enumerate them if needed etc.
var dispatcher = host.ChannelDispatchers[0] as ChannelDispatcher;
dispatcher.ChannelInitializers.Add(new MyHook());

由于您使用的是按会话实例模式,因此您将在客户端首次连接时为每个新会话创建一个新通道。通道调度程序是负责获取新创建的通道并将其与特定服务对象实例相关联(进行地址匹配等)的对象。它会在您的服务连接到新通道之前在新通道上运行每个自定义初始化程序。

【讨论】:

谢谢!这确实回答了我的问题 有关其他信息,请参阅:blogs.msdn.com/b/carlosfigueira/archive/2012/02/14/… 特别是对于 WCF 4.0,建议的方法将不起作用,因为在主机转换为打开状态后会引发异常【参考方案2】:

取决于您的设置 - 您是否进行“每次通话”对话?那么你本身并没有真正得到任何“客户端现在已连接”的消息......

您是否进行基于会话的对话?您的“ServiceHost”类有两个事件“Opening”和“Opened”,您可以挂钩,尤其是在您自行托管服务的情况下。

你想通过捕获这个事件来达到什么目的?

马克

【讨论】:

基于会话。服务主机在服务主机启动时触发 Opened 事件,例如:在 host.Open() 调用上,而不是在新客户端连接时 如果是InstanceContextMode.Single,您有什么建议吗?

以上是关于当客户端连接到 WCF 托管的端点时触发事件的主要内容,如果未能解决你的问题,请参考以下文章

当客户端甚至无法连接到 WCF 服务器时,为啥会出现“服务器堆栈跟踪”异常?

无法连接到我的Localhost上的WCF服务

从 WCF 服务向网站发送数据

使用 gSOAP 连接到 WCF Web 服务

添加服务引用仅适用于 localhost wcf 服务

Windows 服务与托管 WCF 服务