繁体   English   中英

我应该如何处理从WCF回调接口对象集合之一引发的异常?

[英]How should I handle exceptions thrown from one of a collection of WCF callback interface objects?

更新:自从写了这个问题以来,我遇到了这个错误报告 ,该报告提供了一种复制我一直看到的错误症状的方法。

我还不能确定这是否是我遇到错误的原因,但值得进行一些调查。 我还没有找到报告中描述的错误的解决方法。

总结报告:如果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对象位于字典中,而不被使用-那么如何处理异常? 我该放在哪里?

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端抛出。 通过将其包装在try and catch中,可以在客户端捕获通信异常。 CommunicationException是在wcf生成的所有异常的基本类型。 您还应该将日志记录添加到wcf服务和客户端。 有关如何在此处添加日志记录的详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM