【问题标题】:Custom WCF fault error not working自定义 WCF 错误错误不起作用
【发布时间】:2015-05-04 16:34:52
【问题描述】:

我正在尝试让 WCF 服务返回自定义错误,以便客户端知道发生了什么。尽管阅读了无数关于如何做到这一点的文章,但没有任何效果。无论我做什么,我都会收到通用的“此故障的创建者没有指定原因”消息。

我已经尝试了以下...

throw new FaultException("It brok!");

...并且已经尝试过...

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

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

有人知道我做错了什么吗?在客户端,我只是将服务调用包装在 try/catch 块中,然后检查异常。

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

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    来自服务行为集

     <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));                                      
    

    【讨论】:

    • 谢谢,但我都试过了。我开始使用常规异常,当它不起作用时切换到故障异常。然后我尝试了自定义异常方法,但我没有将所有代码复制到我原来的问题中以节省空间。这些都不起作用,这就是我问这个问题的原因。我完全按照我读到的所有文章所说的去做,但没有任何效果。我尝试使用 includeExceptionDetailInFaults false 和 true,它也没有任何区别。还有其他想法吗?再次感谢
    • 我刚刚更新了我的答案,您可以在您的代码中使用该示例再试一次吗?
    • 不,同样的问题。我什至尝试简化它并使用字符串... throw new FaultException("Missing PCR number", new FaultReason("Missing PCR number")) 但它不起作用。仍然在客户端收到通用消息。我将 [FaultContract(typeof(string))] 添加到服务方法中。有任何想法吗?再次感谢。
    • “此故障的创建者......”错误。当我在 VS2010 中调试时发生了这种情况。我找到了这篇文章:sergecalderara.wordpress.com/2008/11/25/…,其中解释了我需要关闭的几个调试选项。请检查
    • 感谢您的回复,但我认为我们在谈论不同的事情。您正在描述服务器中发生的情况,我正在尝试在客户端中获取异常。告诉 VS 不要闯入服务器并不能帮助我在客户端中获取异常详细信息。无论如何谢谢。
    【解决方案2】:

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

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

    故事的核心是,如果某件事应该有效而无效,请检查是否有聪明人做了聪明的事却没有告诉你!

    感谢所有回复的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2023-03-27
      • 2013-03-06
      • 2012-07-24
      • 2014-03-30
      • 2016-09-22
      相关资源
      最近更新 更多