【问题标题】:WCF channel randomly becomes Faulted (upon thread termination)WCF 通道随机变为故障(在线程终止时)
【发布时间】:2012-05-22 19:30:28
【问题描述】:

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

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

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

Logger.Debug("Message");

将在内部作为 WCF 服务调用重定向到第一个 AppDomain:

public void Debug(string message)
{
    if (useService)
    {
        logProxy.Log(message);
    }
}

问题在于,在 随机 场合,我看到服务代理转换为 Faulted 状态。

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

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

另外——ClientBase 是否优于使用 ChannelFactory 选项来创建客户端代理?

关于我的设置的一些额外细节:

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

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    只有客户端可以处理。

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

    【讨论】:

    • 能有什么合乎逻辑的解释为什么它会变成故障吗?服务调用(默认情况下)不是阻塞的吗?这意味着调用应该在完成后返回,使线程终止成功而不会使代理失效。
    • 我的回答很糟糕,很糟糕,可能有很多原因,您能否提供有关操作环境性质的更具体信息? (被遍历的网络设备,被调用的数量,被发送的数据大小)
    • 很难说,因为这个问题很随机。但是,使用的绑定是 IPC,这意味着本身没有建立实际的“网络”连接(用作进程间/应用程序域通信)。
    • 嗯,这排除了应用程序池重启问题(在客户端拨打电话时服务重启)。我假设您已尝试在客户端周围添加异常包装器,因为这会给您带来更全面的错误(假设启用了包含异常)。下一步是启用 WCF 诊断并查看它生成的日志文件,以查看是否通过服务记录了错误。
    • 包含例外已启用。对于随机问题,诊断有点困难,因为可能需要一段时间才能重现问题,因此很难在诊断模式下长时间运行。
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2016-03-20
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多