更新: 自从写了这个问题以来,我遇到了这个错误报告,它提供了一种复制我一直看到的错误症状的方法。
我还不能确认这是否是我遇到的错误的原因,但需要进行一些调查。我还没有遇到报告中描述的错误的解决方法。
总结报告:如果 WCF 客户端在 WCF 服务的身份验证期间关闭,则在服务中引发异步异常,(在我的情况下)直到它到达 program.cs 文件才被捕获,因此难以处理优雅地。
原始问题:
我在 Windows 服务中托管了一个 WCF 服务。
WCF 服务允许客户端订阅(提供回调),之后,服务将更新发布给所有订阅者。
该服务维护Dictionary<int, ICallback>
所有当前订阅者的回调接口。
当发生需要发布信息的事件时,服务会遍历集合并调用 ICallback 中定义的适当方法。
这一切都很好,所有使用 ICallback 对象的场合都包含在 try catch 中,以防对象处理异常和可能发生的任何其他异常。
我遇到的问题是服务中出现了通信异常:
System.ServiceModel.CommunicationException:
套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题造成的。
本地套接字超时为“10675199.02:48:05.4775807”。
System.IO.IOException:读取操作失败,请参阅内部异常。
System.ServiceModel.CommunicationException:套接字连接已中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题造成的。
本地套接字超时为“10675199.02:48:05.4775807”。
System.Net.Sockets.SocketException:现有连接被远程主机强行关闭
此异常未被捕获并导致应用程序崩溃。
因为它没有被捕获,所以我假设在服务尝试发布数据时没有抛出异常,因为这总是发生在 try-catch 中。
此异常可能是由客户端应用程序错误地关闭通道/套接字引起的吗?
更重要的是,当异常源自的对象当前没有在正在运行的线程中被访问时,如何捕获以这种方式引发的异常?
即 ICallback 对象位于字典中,没有被使用,当抛出异常时 - 那么我该如何处理异常呢?我在哪里放try catch?
WCF 服务订阅方法
public static int Subscribe()
{
int id = -1;
OperationContext currentContext = OperationContext.Current;
if (currentContext != null)
{
ICallback callback = currentContext.GetCallbackChannel<ICallback>();
if (callback != null)
{
id = GetNextId();
lock (SubscriberLock)
{
Subscribers.Add(id, callback);
}
}
}
return id;
}
在此方法完成后的一段时间内抛出异常。
我对我已经非常清楚地解释了这个问题感到不高兴,所以如果有一个不是很清楚的具体点,请要求澄清。
谢谢!