65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (6投票s)

2011年12月4日

CPOL

2分钟阅读

viewsIcon

42193

本文档解释了如何处理/控制服务发送给客户端的异常消息。它还解释了如何使用 faults 抛出自定义错误消息给客户端。

引言

本文涵盖以下领域

  1. 如何启用/禁用从 WCF 服务向客户端发送异常详情
  2. 如何使用 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
© . All rights reserved.