【问题标题】:How should I handle exceptions thrown from one of a collection of WCF callback interface objects?我应该如何处理从一组 WCF 回调接口对象中抛出的异常?
【发布时间】: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;
}

此方法完成后一段时间抛出异常。

我对我已经非常清楚地解释了这个问题感到不高兴,所以如果有一个不是很清楚的具体点,请要求澄清。

谢谢!

【问题讨论】:

标签: c# wcf exception-handling callback


【解决方案1】:

通信异常将在客户端抛出,而不是在 WCF 端。 您可以通过将其包装在 try and catch 中来在客户端捕获通信异常。 CommunicationException 是 wcf 生成的所有异常的基本类型。您还应该将日志记录添加到您的 wcf 服务和客户端。详细介绍如何添加日志here.

【讨论】:

  • 您好阿南德,感谢您的回答。客户端和服务都使用 WCF,但我假设您的意思是服务端而不是 WCF 端。我在问题中引用的通信异常是从服务日志文件而不是客户端复制和粘贴的。我正在努力寻找重现错误的方法,然后将尝试实施您在链接中建议的跟踪。
  • 是的,我指的是服务端。您是否在客户端进行过任何类型的日志记录、异常处理?
  • 是的 - 我目前无法访问客户端日志文件。该错误根本不会中断客户端应用程序的操作 - 它会继续正常运行(表明如果在此端抛出异常,则它会得到适当的处理)。
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2010-11-24
  • 2011-04-07
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多