我们正在构建一个WCF服务器(.NET 4.0)。它将只使用net.tcp传输。
当客户端关闭TCP连接时,服务器得到未经处理的CommunicationException,并终止。
Q1。如何处理CommunicationException,使服务器不会终止并继续为其他客户端提供服务?
Q2。在处理程序中,如何获取已中止的会话的SessionId?我需要它来清理一些特定于会话的数据。
提前感谢!
附注:连接是通过Internet进行的,因此套接字可以随时关闭,无论客户端断开连接是否正常。
发布于 2011-03-17 20:22:58
任何WCF通道都实现了ICommunicationObject,它为通道生存期提供事件。
您应该监听Faulted事件
可以像往常一样从OperationContext.Current属性访问sessionId。
当您的客户端打开通道时(在第一次操作时),注册到适当的事件:
OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
OperationContext.Current.Channel.Closed += new EventHandler(Channel_Faulted);
和:
void Channel_Faulted(object sender, EventArgs e)
{
Logout((IContextChannel)sender);
}
protected void Logout(IContextChannel channel)
{
string sessionId = null;
if (channel != null)
{
sessionId = channel.SessionId;
}
[...]
}
发布于 2015-07-03 23:43:27
ICommunicationObject obj = (ICommunicationObject)callback;
obj.Closed += new EventHandler((a, b) =>
{
if (list.Exists(cli => cli.CallbackService == (ITecnobelRemoteServiceCallback)a))
{
var query = (from cc in list where cc.CallbackService == (ITecnobelRemoteServiceCallback)a select cc).ToList();
query.ForEach(
delegate (Client ccc)
{
ccc.CallbackService = null;
});
}
});
https://stackoverflow.com/questions/5338842
复制相似问题