处理WCF服务中的异常?

时间:2014-01-02 06:13:30

标签: c# wcf web-services soap soapexception

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

3 个答案:

答案 0 :(得分:4)

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

请参阅Specifying and Handling Faults in Contracts and Services

答案 1 :(得分:4)

作为stated on MSDN

  

WCF应用程序遇到的错误属于三个中的一个   基团:

     
      
  • 通讯错误
  •   
  • 代理/渠道错误
  •   
  • 应用程序错误
  •   
     当网络不可用,客户端使用错误的地址或服务主机未侦听时,会发生

通信错误   传入的消息。此类型的错误将作为返回给客户端   CommunicationException或CommunicationException派生类。

     

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

     在执行服务操作期间发生

应用程序错误。此类错误将作为发送给客户端   FaultExceptionFaultException<TDetail>

     

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

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

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

     

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

     

ServiceHost事件 ServiceHost类承载服务并定义处理错误可能需要的几个事件。对于   例如:

     

1.Faulted

     

2.UnknownMessageReceived

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

答案 2 :(得分:0)

如果您有时间表来创建一组从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类路由安全客户端异常与非安全客户端异常。