在WCF服务中处理异常?

3

我有一个项目,需要调用基于SOAP的服务。 我使用故障和通信异常作为API调用中最常见的两个异常。但是,如果在SOAP API中发生除这两个异常之外的其他异常怎么办?

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

后来我在互联网上了解到有关SOAP异常类的内容,考虑将我的代码更改为:

     try
    {
      //soap api
    }

    catch(SoapException ex)
    {
    }

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

 try
    {
      //soap api
    }
    catch(FaultException ex)
    {
    }
    catch(CommunicationException ex)
    {
    }
    catch(SoapException ex)
    {
    }
3个回答

4

你的意思是说现在SOAP异常已经过时了吗?如果是,那么实现我的任务的最佳方法是什么? - shujaat siddiqui
如果你坚持使用WCF,那么你永远也看不到它。你所阅读的关于SoapException的文章是在讨论一种过时的技术。 - John Saunders
那么新的是什么?希望因为你,我能将我的项目迁移到最新的技术上? - shujaat siddiqui

4

MSDN上所述

一个WCF应用程序遇到的错误属于以下三个组:
- 通信错误 - 代理/通道错误 - 应用程序错误 通信错误发生在网络不可用、客户端使用了错误的地址或服务主机未监听传入消息时。这类错误将以CommunicationException或从CommunicationException派生的类返回给客户端。 代理/通道错误是通道或代理本身发生的错误。这类错误包括:尝试使用已关闭的代理或通道、客户端和服务之间存在合同不匹配,或客户端凭据被服务拒绝。此类错误有许多不同类型,过多而无法在此列出。这类错误会原样返回给客户端(异常对象不进行任何转换)。 应用程序错误发生在服务操作执行期间。这类错误将作为FaultExceptionFaultException<TDetail>发送给客户端。
在WCF中,错误处理由以下一种或多种方式执行:
- 直接处理所抛出的异常。只针对通信和代理/通道错误进行此操作。 - 使用故障合同 - 实现IErrorHandler接口 - 处理ServiceHost事件 故障合同故障合同允许您以独立于平台的方式定义服务操作期间可能发生的错误。默认情况下,从服务操作内抛出的所有异常都将作为FaultException对象返回给客户端。FaultException对象的信息很少。您可以通过定义故障合同并将错误作为FaultException返回来控制发送到客户端的信息。有关更多信息,请参阅“规范和处理合同和服务中的故障”。 IErrorHandler IErrorHandler接口允许您更加控制WCF应用程序响应错误的方式。它使您完全控制返回给客户端的故障消息,并允许您执行自定义错误处理(例如记录)。有关更多信息,请参阅“IErrorHandler和扩展对错误处理和报告的控制”。 ServiceHost事件 ServiceHost类托管服务并定义可能需要处理错误的几个事件。例如:
- Faulted - UnknownMessageReceived

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


当您复制文本时,您必须引用所有被复制的内容。您不能仅仅在文本底部放置一个链接,因为这会给人留下您是作者的印象。引用必须明确,就像我已经编辑到上面那样做到明确。 - Brad Larson

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类可以路由安全和非安全的客户端异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接