自定义WCF错误错误无效

时间:2015-05-04 16:34:52

标签: c# wcf

我正在尝试获取WCF服务以返回自定义错误,以便客户端知道发生了什么。尽管阅读了关于如何做到这一点的无休止的文章,但没有任无论我做什么,我都会得到通用的“这个错误的创造者没有指明原因”的信息。

我试过以下......

throw new FaultException("It brok!");

......并试过......

throw new FaultException<VrtSystemNotFoundException>(new VrtSystemNotFoundException());

...但客户端只能看到标准的FaultException。

任何人都有任何想法我做错了什么?在客户端中,我只是将服务调用包装在try / catch块中,并检查异常。

我正在使用Visual Studio 2013以防万一。

2 个答案:

答案 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)

哼哼哼。事实证明,它不起作用的原因是我们团队中的WCF专家已向客户端添加了行为扩展,这使我们的服务能够发回更详细的异常。但是,我在单独的VS项目中测试我的代码,并没有引用这个额外的库,因此所有异常都被转换为标准的FaultException。

一旦我添加了对库的引用,并在测试客户端的app.config中配置它,它就可以正常工作。

故事的故事是,如果有什么东西应该起作用而不是,那就检查一下有没有聪明的人做过一些聪明而没有告诉你的事情!

感谢所有回复的人。