使用 FaultContract 从 WCF 服务抛出自定义错误信息






4.81/5 (6投票s)
本文档解释了如何处理/控制服务发送给客户端的异常消息。它还解释了如何使用 faults 抛出自定义错误消息给客户端。
引言
本文涵盖以下领域
- 如何启用/禁用从 WCF 服务向客户端发送异常详情
- 如何使用 faults 向客户端抛出自定义错误消息
详细说明
1. 如何启用/禁用从 WCF 服务向客户端发送异常详情
如果您从 WCF 服务抛出异常,WCF 环境会自动将该异常转换为 FaultException
。客户端接收到的信息取决于端点行为。请参阅以下两种情况
当 Behavior 包含 <serviceDebug includeExceptionDetailInFaults="False" /> 时
从 WCF 服务抛出异常如下所示
throw new Exception("Custom Exception");
在客户端,您将获得带有消息 FaultException
, “服务器由于内部错误无法处理请求…”。在这种情况下,用户将无法知道抛出的异常。
当 Behavior 包含 <serviceDebug includeExceptionDetailInFaults="True" /> 时
从 WCF 服务抛出异常如下所示
throw new Exception("Custom Exception");
在客户端,您将获得带有消息 “自定义异常
” 的 FaultException
。
注意:在生产环境中,您必须将 includeExceptionDetailInFaults=”False”
保持开启,以限制服务将敏感信息发送到客户端。
2. 如何使用 faults 向客户端抛出自定义错误消息
从以上内容可以看出,您无法将自定义错误消息作为异常从服务中抛出。为了抛出自定义错误消息,您必须定义一个数据契约类型,并将其作为 fault 抛出。请参阅以下示例。
创建一个数据契约如下
[DataContract]
public class OrderFault
{
[DataMember]
public int OrderId { get; set; }
[DataMember]
public string Message { get; set; }
}
为了向客户端抛出 Fault,我们必须使用 FaultContractAttribute
在方法/操作之上指定预期的 faults,如下所示
[OperationContract]
[FaultContract(typeof(OrderFault))]
OrderType GetOrder(int orderId);
在方法定义中,按如下方式抛出 Fault
OrderFault fault = new OrderFault{OrderId = 10, Message="Fault"};
throw new FaultException<OrderFault>(fault, "Order Fault");
现在在客户端,您必须按如下方式捕获 fault
catch (FaultException<OrderFault> ex)
{
}
在 catch
内部,您可以使用 ex.Detail
获取异常详情。在我们的例子中,它是 OrderFault
。
就这样。通过这种方式,您可以从 WCF 服务抛出自定义错误消息作为 fault,并在客户端中使用。
注意:即使您从操作中抛出 fault,如果您没有为该操作指定预期的 Fault,在客户端您将无法获得该 fault。
历史
- V1.0.0.0