WCF异常传播

  • 传送至客户端的异常肯定是CommunitionException类型,包括一般的通信过程中出错而引发的CommunicationException类型,System.IdentityModel.Selectors.UserNamePasswordValidator扩展能抛出的System.ServiceModel.Security.MessageSecurityException,还有一般业务能够引发的FaultException(包括FaultException<TExceptionDetail>)
  • 若服务端抛出的不是FaultException类型的异常,那异常被格式化成FaultException<TExceptionDetail>(以传递给客户端)时其详细信息是否会被被塞到ExceptionDetail中取决于"IncludeExceptionDetailInFaults"设置
  • 若服务端抛出的是FaultException<TExceptionDetail>异常,则还需要在契约上使用FaultContract标识TExceptionDetail以便客户端接收到后能够正确识别(反序列化),除非TExceptionDetail就是ExceptionDetail类型(也不能是其子类)
  • 默认服务端或客户端(回调)若抛出非FaultException,通道会进入出错状态而无法继续使用
    • 可通过自定义IErrorHandler扩展改变这种方式,但要注意的是:在扩展实现中,应该在IErrorHandler.ProvideFault的实现中为fault引用参数构建异常消息实例,因为如果用于客户端(回调),那异常是“非FaultException”的情况下,无法再通过IErrorHandler.HandleError决定通道是否进入出错状态。
    • 也可通过将服务方法(服务端)或回调方法(客户端)设为单向以避免通道出错。