我正在处理下面的通道故障和关闭事件
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple,
UseSynchronizationContext = false)]
OperationContext.Current.Channel.Faulted += Channel_Faulted;
OperationContext.Current.Channel.Closed += Channel_Closed;
private void Channel_Faulted(object sender, EventArgs e)
{
//perform Something
}
private void Channel_Closed(object sender, EventArgs e)
{
//perform Something
}
绑定信息如下。
NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None, true);
tcpBinding.ReceiveTimeout = new TimeSpan(48, 0, 0);
tcpBinding.ReliableSession.Enabled = true;
tcpBinding.ReliableSession.InactivityTimeout = new TimeSpan(0, 0, 10);
当我通过关闭/中止代理来优雅地结束客户端时,事件处理程序会被命中,但是当我通过任务管理器终止客户端进程或关闭运行客户端的系统时,事件处理程序不会被调用。我在这做错了什么?处理这种情况的任何代码示例都会有所帮助,谢谢。
这是XY问题吗?如果您的服务实例是PerCall
,那么无关紧要,因为每次对服务的方法调用都会打开和关闭连接。
服务故障仅在使用WCF管道时发生。杀死进程将切断底层TCP连接。除非您的服务器正在使用该通道,否则它不会出错。
我通常喜欢用我的每个会话的WCF服务标记他们IDisposable
然后处理Dispose
中的任何清理任务,无论优雅终止。