3

我有一个项目,我在其中调用基于肥皂的服务。我正在使用故障和通信异常,因为其中大多数异常发生在调用 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)
    {
    }
4

3 回答 3

4

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

请参阅在合同和服务中指定和处理错误

于 2014-01-02T06:15:53.003 回答
4

MSDN 所述

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

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

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

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

执行服务操作期间发生应用程序错误。此类错误将作为 FaultException或发送给客户端FaultException<TDetail>

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

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

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

IErrorHandler IErrorHandler 接口允许您更好地控制 WCF 应用程序如何响应错误。它使您可以完全控制返回给客户端的错误消息,并允许您执行自定义错误处理,例如日志记录。有关详细信息,请参阅 IErrorHandler 和扩展对错误处理和报告的控制

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

1.故障

2.UnknownMessageReceived

您也可以参考一个类似的问题,该问题也有很多很好的答案: 在 WCF 服务中处理异常的最佳方法是什么?

于 2014-01-02T06:22:23.407 回答
1

如果您有时间创建一组很好的自定义异常,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类路由安全与非安全客户端异常。

于 2014-01-02T06:27:09.133 回答