1

我有一个抛出此常见错误的 WCF 客户端,只是通过重试对服务器的 HTTP 调用来解决。值得一提的是,此异常并未在 1 分钟内生成。它在 3 秒内生成。

发送到 xxxxxx 的请求操作在配置的超时 (00:01:00) 内没有收到回复。分配给此操作的时间可能是较长超时的一部分。这可能是因为服务仍在处理操作,或者因为服务无法发送回复消息。请考虑增加操作超时(通过将通道/代理转换为 IContextChannel 并设置 OperationTimeout 属性)并确保服务能够连接到客户端

专业人员如何处理这些常见的 WCF 错误?我应该处理哪些其他虚假错误。

例如,我正在考虑对 WCF 调用进行计时,如果在 55 秒内引发上述(虚假)错误,我将重试整个操作(使用 while() 循环)。我相信我必须重置整个频道,但我希望你们能告诉我什么是正确的。

还有别的

4

1 回答 1

1

我从处理异常和潜在退休的自定义“使用”语句进行所有 WCF 调用。我的代码可选地允许我将策略对象传递给语句,以便我可以轻松地更改行为,例如如果我不想重试错误。

代码的要点如下:

[MethodImpl(MethodImplOptions.NoInlining)]
public static void ProxyUsing<T>(ClientBase<T> proxy, Action action)
    where T : class
{
    try
    {
        proxy.Open();
        using(OperationContextScope context = new OperationContextScope(proxy.InnerChannel))
        {
          //Add some headers here, or whatever you want
            action();
        }
    }
    catch(FaultException fe)
    {
      //Handle stuff here
    }
    finally
    {
        try
        {
            if(proxy != null
                && proxy.State != CommunicationState.Faulted)
            {
                proxy.Close();
            }
            else
            {
                proxy.Abort();
            }
        }
        catch
        {
            if(proxy != null)
            {
                proxy.Abort();
            }
        }
    }
}

然后,您可以使用如下调用:

ProxyUsing<IMyService>(myService = GetServiceInstance(), () =>
{
    myService.SomeMethod(...);
});

NoInlining 调用可能对您来说并不重要。我需要它,因为我有一些自定义日志记录代码可以记录异常后的调用堆栈,因此在这种情况下保留该方法层次结构很重要。

于 2011-01-21T03:47:57.357 回答