【发布时间】:2012-07-02 11:55:37
【问题描述】:
更新: 自从写了这个问题后,我遇到了这个Bug Report,它提供了一种复制我一直看到的错误症状的方法。
我还不能确认这是否是我遇到的错误的原因,但需要进行一些调查。我还没有遇到报告中描述的错误的解决方法。
总结报告:如果 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;
}
此方法完成后一段时间抛出异常。
我对我已经非常清楚地解释了这个问题感到不高兴,所以如果有一个不是很清楚的具体点,请要求澄清。
谢谢!
【问题讨论】:
-
首先,您可以查看 WCF 诊断:msdn.microsoft.com/en-us/library/ms733025.aspx。你可能会得到更多关于这个异常的情报。
-
捕获未处理的异常,因为你没有指定:对于winforms:stackoverflow.com/questions/2770/…,WPF:codeproject.com/Articles/90866/…,Silverlight:msdn.microsoft.com/en-us/library/…
-
@ChrisSinclair - 谢谢克里斯,我已经在遵循这种模式了。这允许我在 program.cs 文件级别记录异常 - 但对于我执行任何有用的清理任务或以允许应用程序继续运行的方式管理异常来说,这有点太晚了。跨度>
标签: c# wcf exception-handling callback