【问题标题】:Handling exceptions in WCF service?处理 WCF 服务中的异常?
【发布时间】:2014-01-02 06:13:30
【问题描述】:

我有一个项目,我在其中调用基于肥皂的服务。我正在使用故障和通信异常,因为其中大多数异常发生在 api 调用中。但是如果在soap api中发生任何其他异常而不是这两个异常怎么办?

    try
    {
      //soap api
    }
    catch(FaultException ex)
    {
    }
    catch(CommunicationException ex)
    {
    }

后来我在互联网上阅读了有关肥皂异常类的信息。我正在考虑更改我的代码,例如:

     try
    {
      //soap api
    }

    catch(SoapException ex)
    {
    }

现在我需要知道的是我是否使用 Soap Exception 而不是故障和通信异常。会好吗?如果它发生在soap api中,我只需要捕获异常。但是我想知道soap api是否也处理故障和通信异常,或者我必须明确定义我的代码?

 try
    {
      //soap api
    }
    catch(FaultException ex)
    {
    }
    catch(CommunicationException ex)
    {
    }
    catch(SoapException ex)
    {
    }

【问题讨论】:

    标签: c# wcf web-services soap soapexception


    【解决方案1】:

    你永远不会看到SoapException。这是过时的 ASMX 技术的一部分。

    Specifying and Handling Faults in Contracts and Services

    【讨论】:

    • 你的意思是说肥皂异常现在已经过时了吗?如果是,请问完成我的任务的最佳方法是什么?
    • 我是说如果你坚持使用 WCF,你将永远看不到一个。您读到的有关 SoapException 的文章正在讨论一种过时的技术。
    • 那么新的是什么?希望你的原因我可以将我的项目转移到最新的技术?
    【解决方案2】:

    作为stated on MSDN:

    WCF 应用程序遇到的错误属于以下三种之一 组:

    • 通讯错误
    • 代理/通道错误
    • 应用程序错误

    通信错误在网络不可用、客户端使用错误地址或服务主机未侦听时发生 传入的消息。这种类型的错误返回给客户端 CommunicationException 或 CommunicationException 派生类。

    代理/频道错误是频道或代理本身发生的错误。此类错误包括:尝试使用代理 或通道已关闭,之间存在合同不匹配 客户端和服务,或客户端的凭据被拒绝 服务。这里面有很多不同类型的错误 类别,太多,这里就不一一列举了。这种类型的错误返回到 客户端原样(不对异常执行任何转换 对象)。

    应用程序错误在服务操作执行期间发生。此类错误将作为 FaultExceptionFaultException<TDetail>

    WCF 中的错误处理由以下一项或多项执行:

    • 直接处理抛出的异常。这仅适用于通信和代理/通道错误。
    • 使用故障合约
    • 实现 IErrorHandler 接口
    • 处理 ServiceHost 事件

    故障合同 故障合同允许您以独立于平台的方式定义服务操作期间可能发生的错误。 默认情况下,从服务操作中抛出的所有异常都将 作为 FaultException 对象返回给客户端。这 FaultException 对象将包含非常少的信息。你可以 通过定义故障来控制发送给客户端的信息 合同并将错误作为 FaultException 返回。更多 信息,请参阅指定和处理合同中的错误和 服务。

    IErrorHandler IErrorHandler 接口允许您更好地控制 WCF 应用程序如何响应错误。它给你满满的 控制返回给客户端的故障消息和 允许您执行自定义错误处理,例如日志记录。为了 更多信息,请参阅 IErrorHandler 和扩展对错误的控制 处理和报告

    ServiceHost 事件 ServiceHost 类托管服务并定义处理错误可能需要的多个事件。为了 示例:

    1.故障

    2.UnknownMessageReceived

    您也可以参考一个类似的问题,该问题也有很多很好的答案: What is the best approach to handle exceptions in WCF service?

    【讨论】:

    • 复制文本时,还必须引用复制的所有内容。您不能只在文本底部放置一个链接,因为这给人的印象是您创作了它。引用必须是明确的,因为我已经在上面进行了编辑。
    【解决方案3】:

    如果您有时间创建一组从 ClientSafeException 扩展的自定义异常,那么我会将它们分为客户端友好异常和非客户端友好异常。

    catch (ClientSafeException safeException)
    {
        response.ServiceResponse= ExceptionHandler.ProcessSafeExceptionResponse(safeException);
         request.Succeeded = false;
    }
    catch (Exception unsafeException)
    {
        response.ServiceResponse= ExceptionHandler.ProcessUnsafeExceptionResponse(unsafeException);
        request.Succeeded = false;
    }
    LogServiceResponse(request, response.ServiceResponse);
    
    return response;
    

    很抱歉没有提到静态 ExceptionHandler 类路由安全与非安全客户端异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多