【发布时间】:2010-10-17 05:33:44
【问题描述】:
当新客户端连接到 WCF 托管服务时,我该怎么做才能触发事件?
编辑:我正在寻找的是在创建新会话或为客户创建新频道时获取事件。如:我正在使用的会话关闭:
OperationContext.Current.Channel.Closed += new EventHandler( Channel_Closed );
那么我应该使用什么来启动会话?
【问题讨论】:
当新客户端连接到 WCF 托管服务时,我该怎么做才能触发事件?
编辑:我正在寻找的是在创建新会话或为客户创建新频道时获取事件。如:我正在使用的会话关闭:
OperationContext.Current.Channel.Closed += new EventHandler( Channel_Closed );
那么我应该使用什么来启动会话?
【问题讨论】:
我认为您要完成的工作最好通过在创建服务侦听器后添加一个新的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());
由于您使用的是按会话实例模式,因此您将在客户端首次连接时为每个新会话创建一个新通道。通道调度程序是负责获取新创建的通道并将其与特定服务对象实例相关联(进行地址匹配等)的对象。它会在您的服务连接到新通道之前在新通道上运行每个自定义初始化程序。
【讨论】:
取决于您的设置 - 您是否进行“每次通话”对话?那么你本身并没有真正得到任何“客户端现在已连接”的消息......
您是否进行基于会话的对话?您的“ServiceHost”类有两个事件“Opening”和“Opened”,您可以挂钩,尤其是在您自行托管服务的情况下。
你想通过捕获这个事件来达到什么目的?
马克
【讨论】: