【问题标题】:What are the cases that cause WCF proxy to be faulted?哪些情况会导致 WCF 代理出错?
【发布时间】:2010-11-14 03:46:38
【问题描述】:

我想知道 WCF 代理(由 vs2008 或 svcutil 生成)出现故障(故障状态)的情况有哪些?这样我就可以重新创建新实例并避免使用有故障的实例。

目前我正在处理 TimeoutException,FaultException,CommunicationObjectAbortedException

            try
            {
                client.Method1(args);
            }
            catch (TimeoutException)
            {
                client.Abort();
                ReCreate();
            }
            catch (FaultException)
            {
                client.Abort();
                ReCreate();
            }
            catch (CommunicationObjectAbortedException)
            {
                client.Abort();
                ReCreate();
            }

我想我可以避免所有这些类型并只处理父 CommunicationException,这是否足够?我需要cmets

【问题讨论】:

    标签: c# wcf fault-tolerance


    【解决方案1】:

    任何未处理并转换为FaultExceptionFaultException<T> 的服务器端未捕获的异常都可能导致您的频道出错。在 per-call 场景或单向场景中,您通常并不真正关心发生故障的通道,但在基于会话的场景中,您肯定会关心!

    您最好的选择是真正尝试在服务器端捕获所有异常,或者只是抑制它们(将它们记录在服务器上并且不做任何事情),或者以FaultException 的方式将它们返回给客户端。

    为了做到这一点,您的服务实现还应该实现 IErrorHandler 接口,它允许您这样做 - 捕获所有异常并记录+抑制它们,或者将它们转换为 SOAP 错误。

    马克

    【讨论】:

    • 如果服务器抛出预期的异常(如(UnauthorizedAccessException 或任何)),它将导致会话出错,客户端应该接受!!
    • 是的,在某些情况下您希望将异常传播给客户端 - 但这是异常而不是规则
    【解决方案2】:

    WCF 代理对象可能会因为除了 faultException 之外的任何类型的异常而出错。所以基本上你最好的选择就是检查代理状态,如果它有错误,请创建一个新的。

    要记住的另一件事是,故障与 WCF 会话有关。如果您不需要 WCF 会话,请确保将其关闭,这样您就避免了一系列可能出现的问题。

    【讨论】:

    • "WCF 代理对象可能会因为除了 faultException 之外的任何类型的异常而出错" 你是指修饰服务方法的通用 FaultException 吗?
    • 对于“任何类型的异常”是否意味着服务有类似“throw new Exception();”之类的东西这会导致会话出错?
    • A FaultException 源自并因此是一个 FaultException。如果服务执行“throw new Exception();”如果使用会话,这将使代理出错。
    猜你喜欢
    • 2010-10-12
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多