Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何处理从WCF回调接口对象集合中抛出的异常?_C#_Wcf_Exception Handling_Callback - Fatal编程技术网

C# 我应该如何处理从WCF回调接口对象集合中抛出的异常?

C# 我应该如何处理从WCF回调接口对象集合中抛出的异常?,c#,wcf,exception-handling,callback,C#,Wcf,Exception Handling,Callback,更新: 自从写这个问题以来,我遇到了这个问题,它提供了一种复制我一直看到的bug症状的方法 我还不能确定这是否是我遇到的bug的原因,但这需要进行一些调查。我还没有找到解决报告中描述的bug的方法 总结一下报告:如果WCF客户端在WCF服务的身份验证期间关闭,则会在该服务上引发异步异常,在我的情况下,该异常在到达program.cs文件之前不会被捕获,因此很难正常处理 原始问题: 我在Windows服务中托管了一个WCF服务 WCF服务允许客户端订阅(提供回调),然后,服务将更新发布到所有订阅服

更新: 自从写这个问题以来,我遇到了这个问题,它提供了一种复制我一直看到的bug症状的方法

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

总结一下报告:如果WCF客户端在WCF服务的身份验证期间关闭,则会在该服务上引发异步异常,在我的情况下,该异常在到达program.cs文件之前不会被捕获,因此很难正常处理

原始问题:

我在Windows服务中托管了一个WCF服务

WCF服务允许客户端订阅(提供回调),然后,服务将更新发布到所有订阅服务器

该服务维护所有当前订阅者的回调接口的
字典

当发生需要发布信息的事件时,服务将在集合中循环并调用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中

此异常是否由客户端应用程序错误地关闭通道/套接字引起

更重要的是,当引发异常的对象当前未在运行线程中被访问时,如何捕获以这种方式引发的异常?

i、 e.当抛出异常时,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;
}
publicstaticintsubscribe()
{
int id=-1;
OperationContext currentContext=OperationContext.Current;
if(currentContext!=null)
{
ICallback callback=currentContext.GetCallbackChannel();
if(回调!=null)
{
id=GetNextId();
锁(订阅锁)
{
添加(id,回调);
}
}
}
返回id;
}
在该方法完成后的一段时间内引发异常

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


谢谢

通信异常将在客户端而不是WCF端引发。
通过将通信异常包装在try-and-catch中,您可以在客户端捕获它。CommunicationException是wcf生成的所有异常的基本类型。您还应该向wcf服务和客户端添加日志记录。如何添加日志记录的详细信息将在客户端而不是WCF端引发通信异常。
通过将通信异常包装在try-and-catch中,您可以在客户端捕获它。CommunicationException是wcf生成的所有异常的基本类型。您还应该向wcf服务和客户端添加日志记录。有关如何添加日志记录的详细信息

首先,您可以查看WCF诊断:。您可能会得到更多有关异常的信息。为了捕获未处理的异常,因为您没有指定:for winforms:,WPF:,Silverlight:@ChrisSinclair-谢谢Chris,我已经在遵循此模式了。这允许我在program.cs文件级别记录异常-但对于我来说,执行任何有用的清理任务或以允许应用程序继续运行的方式管理异常都为时已晚。首先,您可以查看WCF诊断:。您可能会得到更多有关异常的信息。为了捕获未处理的异常,因为您没有指定:for winforms:,WPF:,Silverlight:@ChrisSinclair-谢谢Chris,我已经在遵循此模式了。这允许我在program.cs文件级别记录异常-但对于我来说,执行任何有用的清理任务或以允许应用程序继续运行的方式管理异常都为时已晚。您好,谢谢您的回答。客户端和服务都在使用WCF,但我假设您指的是服务端,而不是WCF端。我在问题中引用的通信异常是从服务日志文件而不是客户端复制和粘贴的。我正在寻找一种复制错误的方法,然后将尝试实现您在链接中建议的跟踪