C# 处理WCF服务中的异常?

C# 处理WCF服务中的异常?,c#,wcf,web-services,soap,soapexception,C#,Wcf,Web Services,Soap,Soapexception,我在一个项目中调用了基于soap的服务。我使用的是故障和通信异常,因为其中两个异常主要发生在api调用中。但是,如果在soap api中发生任何其他异常而不是这两个异常,该怎么办 try { //soap api } catch(FaultException ex) { } catch(CommunicationException ex) { } 后来我在互联网上读到了关于soap异常类的文章。我正在考虑更改我

我在一个项目中调用了基于soap的服务。我使用的是故障和通信异常,因为其中两个异常主要发生在api调用中。但是,如果在soap api中发生任何其他异常而不是这两个异常,该怎么办

    try
    {
      //soap api
    }
    catch(FaultException ex)
    {
    }
    catch(CommunicationException ex)
    {
    }
后来我在互联网上读到了关于soap异常类的文章。我正在考虑更改我的代码,如:

     try
    {
      //soap api
    }

    catch(SoapException ex)
    {
    }
现在我需要知道的是,我是否使用Soap异常而不是错误和通信异常。好吗?我所需要的只是捕获soap api中发生的异常。然而,我想知道soap api是否也处理故障和通信异常,或者我必须像这样显式地定义代码

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

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

参见。

如下:

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

  • 通信错误
  • 代理/通道错误
  • 应用程序错误
当网络不可用、客户端使用不正确的地址或服务主机未侦听时,会发生通信错误 传入消息。此类型的错误将作为错误返回给客户端 CommunicationException或CommunicationException派生类

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

在执行服务操作期间发生应用程序错误。这类错误将作为错误发送到客户端
FaultException
FaultException

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

  • 直接处理抛出的异常。这仅适用于通信和代理/通道错误
  • 使用过错契约
  • 实现IErrorHandler接口
  • 处理ServiceHost事件
故障契约故障契约允许您以独立于平台的方式定义服务操作期间可能发生的错误。 默认情况下,服务操作中引发的所有异常都将 作为FaultException对象返回给客户端。这个 FaultException对象将包含很少的信息。你可以 通过定义故障来控制发送给客户端的信息 协定并将错误作为FaultException返回。更多 有关详细信息,请参见合同中的指定和处理故障以及 服务

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

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

1.有缺陷

2.收到的未知消息

您还可以参考一个类似的问题,该问题也有许多好的答案:

如果您有时间线来创建一组从
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;

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

您的意思是说soap异常现在被禁止了吗?如果是,那么实现我的任务的最佳方法是什么?我是说,如果你坚持使用WCF,你将永远看不到。你读到的那篇关于SoapException的文章讨论的是一种过时的技术。那么新技术是什么呢?希望因为你,我可以将我的项目转移到最新的技术上?当你复制文本时,你还必须引用所有被复制的内容。你不能只在文本的底部放置一个链接,因为这样会给人一种你是作者的印象。引用必须是明确的,因为我已经编辑到上面。
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;