我正在尝试获取WCF服务以返回自定义错误,以便客户端知道发生了什么。尽管阅读了关于如何做到这一点的无休止的文章,但没有任无论我做什么,我都会得到通用的“这个错误的创造者没有指明原因”的信息。
我试过以下......
throw new FaultException("It brok!");
......并试过......
throw new FaultException<VrtSystemNotFoundException>(new VrtSystemNotFoundException());
...但客户端只能看到标准的FaultException。
任何人都有任何想法我做错了什么?在客户端中,我只是将服务调用包装在try / catch块中,并检查异常。
我正在使用Visual Studio 2013以防万一。
答案 0 :(得分:1)
来自服务行为集
<serviceDebug includeExceptionDetailInFaults="True" />:
从WCF服务中抛出异常,如下所示:
throw new Exception("Custom Exception");
在客户端,您将收到FaultException,并显示消息“Custom Exception”。
注意:在生产中,您必须保留includeExceptionDetailInFaults =“False”,以限制服务向客户端发送敏感信息。
您不能将自定义错误消息作为服务的异常引发。为了抛出自定义错误消息,您必须定义数据协定类型并将其作为错误抛出。请参阅以下示例。
[DataContract]
public class OrderFault
{
[DataMember]
public int OrderId { get; set; }
[DataMember]
public string Message { get; set; }
}
为了将Fault抛给客户端,我们必须使用FaultContractAttribute在方法/操作之上指定预期的错误,如下所示:
[OperationContract]
[FaultContract(typeof(OrderFault))]
OrderType GetOrder(int orderId);
现在在客户端,您必须按如下方式捕获错误:
catch (FaultException<OrderFault> ex)
{
}
在catch中,您可以使用ex.Detail获取异常详细信息。在我们的例子中,它是OrderFault。
就是这样。通过这种方式,您可以将自定义错误消息作为WCF服务的错误抛出并在客户端中使用。
注意:即使您从操作中抛出错误,如果您没有为操作指定预期的故障,在客户端也不会出现故障。
FaultException的Message属性是错误页面上显示的内容,因此如果未填充,您将看到此错误的创建者未指定原因&#39;信息。要轻松填充它,请在服务中抛出错误时使用两个参数构造函数,如下所示,从您的错误类型传递错误消息,如下例所示
InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage));
答案 1 :(得分:1)
一旦我添加了对库的引用,并在测试客户端的app.config中配置它,它就可以正常工作。
故事的故事是,如果有什么东西应该起作用而不是,那就检查一下有没有聪明的人做过一些聪明而没有告诉你的事情!
感谢所有回复的人。