来自服务行为集
<serviceDebug includeExceptionDetailInFaults="True" />:
从 WCF 服务中,抛出如下所示的异常:
throw new Exception("Custom Exception");
在客户端,您将收到带有“自定义异常”消息的 FaultException。
注意:在生产环境中,您必须保持 includeExceptionDetailInFaults=”False” 以限制服务向客户端发送敏感信息。
您不能将自定义错误消息作为服务的异常抛出。为了抛出自定义错误消息,您必须定义数据协定类型并将其作为错误抛出。请参阅以下示例。
[DataContract]
public class OrderFault
{
[DataMember]
public int OrderId { get; set; }
[DataMember]
public string Message { get; set; }
}
为了向客户端抛出故障,我们必须使用 FaultContractAttribute 指定方法/操作上方的预期故障,如下所示:
[OperationContract]
[FaultContract(typeof(OrderFault))]
OrderType GetOrder(int orderId);
现在在客户端,您必须按以下方式捕获故障:
catch (FaultException<OrderFault> ex)
{
}
在catch里面,你可以使用ex.Detail获取异常详情。在我们的例子中,它是 OrderFault。
就是这样。这样,您可以从 WCF 服务中将自定义错误消息作为故障抛出并在客户端中使用。
注意:即使你从操作中抛出错误,如果你没有为操作指定预期的错误,在客户端你不会得到错误。
FaultException 的 Message 属性是错误页面上显示的内容,因此如果未填充,您将看到“此错误的创建者未指定原因”消息。要轻松填充它,请在服务中引发错误时使用两个参数构造函数,如下所示,从错误类型中传递错误消息,如下例所示
InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage));