我有一个使用会话的WCF应用程序。
会话结束时是否有任何中心事件被抛出?如何找出会话何时结束WITHOUT(!)调用方法(网络断开连接,客户端崩溃 - 所以没有“注销”方法调用)?
服务器托管为:
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Reentrant,
UseSynchronizationContext = false,
IncludeExceptionDetailInFaults = true
)]
基本上是因为它使用的是回调接口。
现在,我基本上需要在会话终止时解除从后端存储创建的实例;)
有什么想法吗?
答案 0 :(得分:9)
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IService
{
public MyService()
{
// Session opened here
OperationContext.Current.InstanceContext.Closed += InstanceContext_Closed;
// get the callback instance here if needed
// OperationContext.Current.GetCallbackChannel<IServiceCallback>()
}
private void InstanceContext_Closed(object sender, EventArgs e)
{
// Session closed here
}
}
该代码不适用于Single / PerCall InstanceContextMode。
答案 1 :(得分:4)
对实例上下文here
有很好的描述实例上下文源自CommunicationObject
通讯对象有一个closing事件。
我自己没有这样做,但理论上应该可以通过挂钩此事件来使用此事件在会话结束时从后端存储中解耦。
答案 2 :(得分:-1)
设置超时值并创建一个在超时之前触发的PingService()方法,这将重置发送和接收超时。
如果你想捕获超时只是尝试一个回调,如果尝试的时间超过绑定的SendTimeout值(我认为默认是1分钟),那么你将抛出超时错误,你可以处理断开连接
没有办法优雅地抓住断开连接的用户(浏览器崩溃,电源熄灭等等)。