Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Wcf - Fatal编程技术网

C# WCF通道随机出现故障(在线程终止时)

C# WCF通道随机出现故障(在线程终止时),c#,.net,wcf,C#,.net,Wcf,我们的应用程序由2个应用程序域组成。 辅助appdomain中的某些方法调用(日志记录)必须“重定向”到第一个appdomain 这是通过在主appdomain上设置WCF服务并让辅助appdomain调用其操作来实现的 例如,下面是在第二个AppDomain中运行的代码: Logger.Debug("Message"); public void Debug(string message) { if (useService) { logProxy.Log(mes

我们的应用程序由2个应用程序域组成。 辅助appdomain中的某些方法调用(日志记录)必须“重定向”到第一个appdomain

这是通过在主appdomain上设置WCF服务并让辅助appdomain调用其操作来实现的

例如,下面是在第二个AppDomain中运行的代码:

Logger.Debug("Message");
public void Debug(string message)
{
    if (useService)
    {
        logProxy.Log(message);
    }
}
将作为WCF服务调用在内部重定向到第一个AppDomain:

Logger.Debug("Message");
public void Debug(string message)
{
    if (useService)
    {
        logProxy.Log(message);
    }
}
问题是,在随机情况下,我看到服务代理转换为故障状态

深入挖掘,我发现当进行服务调用的线程关闭时,在某些情况下代理对象会出现故障

我的问题是——在执行WCF服务调用但启动调用的线程关闭的情况下,如何保护自己?(可能在收到答复之前)

另外--ClientBase是否比使用ChannelFactory选项创建客户端代理更有利

有关我的设置的一些额外详细信息:

  • WCF服务通过NetNamedPipeBinding(命名管道)公开
  • 我使用ChannelFactory.CreateChannel方法创建“客户端”代理(而不是ClientBase)

只有客户端才能处理此问题

ServiceClient client = new ServiceClient();
 try {
     client.Operation();
 }
 catch(Exception ex)
 {
     if (client.State == CommunicationState.Faulted)
     {
             client.Abort();
             client = new ServiceClient();
     }
 }

只有客户端可以处理这个问题

ServiceClient client = new ServiceClient();
 try {
     client.Operation();
 }
 catch(Exception ex)
 {
     if (client.State == CommunicationState.Faulted)
     {
             client.Abort();
             client = new ServiceClient();
     }
 }

为什么会变成错误,有什么合乎逻辑的解释吗?服务调用(默认情况下)不阻塞吗?这意味着调用应该在完成后返回,使线程终止成功进行,而不会使代理失效。我的回答很糟糕,很糟糕,可能有很多原因,为什么,您能提供有关操作环境性质的更具体信息吗?(正在穿越的网络设备、拨打的电话数量、发送的数据大小)很难说,因为问题相当随机。不过,使用的绑定是IPC,这意味着本身没有实际的“网络”连接(用作进程间/appdomain通信)。嗯,这排除了应用程序池重启问题(在客户端调用时服务重启)。我假设您已经尝试在客户机周围添加异常包装器,因为这会导致更完整的错误(假设启用了包含异常)。下一步是启用WCF诊断并查看它生成的日志文件,以查看是否通过服务记录了错误。启用了“包含异常”。对于随机问题,诊断有点困难,因为可能需要一段时间才能重现问题,这使得它很难在诊断模式下长时间运行。对于为什么会变成故障,是否有任何逻辑解释?服务调用(默认情况下)不阻塞吗?这意味着调用应该在完成后返回,使线程终止成功进行,而不会使代理失效。我的回答很糟糕,很糟糕,可能有很多原因,为什么,您能提供有关操作环境性质的更具体信息吗?(正在穿越的网络设备、拨打的电话数量、发送的数据大小)很难说,因为问题相当随机。不过,使用的绑定是IPC,这意味着本身没有实际的“网络”连接(用作进程间/appdomain通信)。嗯,这排除了应用程序池重启问题(在客户端调用时服务重启)。我假设您已经尝试在客户机周围添加异常包装器,因为这会导致更完整的错误(假设启用了包含异常)。下一步是启用WCF诊断并查看它生成的日志文件,以查看是否通过服务记录了错误。启用了“包含异常”。对于随机问题,诊断有点困难,因为可能需要一段时间才能重现问题,这使得很难在诊断模式下长时间运行。