【问题标题】:WCF newbie - is FaultException<T> safe for non-.NET clients?WCF 新手 - FaultException<T> 对非.NET 客户端安全吗?
【发布时间】:2012-09-24 14:39:08
【问题描述】:

WCF 新手警报。我正在阅读“学习 WCF”和“编程 WCF 服务”,这两本书都建议抛出 FaultException。如果 T 是 .NET 类型“DivideByZeroException”并假设存在一个 FaultContract 与

[FaultContract(typeof(DivideByZeroException))]

在方法“Divide”上,使用该 WCF 服务和方法的非 .NET 客户端是否能够理解和处理该 .NET 异常?如果是,是否因为类型信息 (DivideByZeroException) 是客户端有权访问和使用的元数据的一部分(由于 FaultContract)?

感谢您的帮助。

【问题讨论】:

    标签: wcf


    【解决方案1】:

    您可以抛出FaultContract&lt;DivideByZeroException&gt;,但通常您不应该这样做,正是因为您提到的原因 (*)。通常推荐的做法是与异常信息(例如异常消息)建立数据协定,然后拥有该类型的FaultContract

    [DataContract]
    public class MyErrorDetails
    {
        [DataMember]
        public string ErrorCode { get; set; }
        [DataMember]
        public string ErrorMessage { get; set; }
    }
    

    然后使用

    [FaultContract(typeof(MyErrorDetails))]
    

    (*) 避免将异常作为错误返回的另一个原因是它们向客户端披露的信息超出了客户端的需要;堆栈跟踪之类的东西会被异常序列化,但这是服务内部的一些信息,不应发送给客户端。

    【讨论】:

    • 我正在尝试验证您的答案。在“故障”下的“编程 WCF 服务”第 208 页中,它说:The fundamental problem with exceptions is that they are technology-specific and as such should not be shared across the service boundary. For seamless interoperability, you need a way to map technology-specific exceptions to some neutral error information. This representation is called soap faults. ... To throw a soap fault the service cannot throw a raw CLR exception. Instead, the service should throw an instance of FaultException&lt;T&gt; class, defined in Example 6-1. 那么 FaultException 好吗?
    • 是的。 FaultException&lt;T&gt; 由 WCF 框架作为一种特殊情况处理 - 它只会序列化错误合同中定义的信息(假设您在操作中声明了 [FaultContract(typeof(T))]),并且该信息基于 SOAP 标准.
    • Appologies Carlos - 你和我在 msdn 上有相同的线程,但我仍然不完全清楚。如果 wcf 服务抛出 CLR DivideByZeroException,并且存在类似 [FaultContract(typeof(DivideByZeroException))] 的 FaultContract,那么这对于非 .NET 客户端是否安全?您对 msdn 的回复让我认为它不安全,因为 DivideByZeroException 不是安全类型(它包含堆栈跟踪和其他您不希望向客户端公开的信息)。但是我在上面的评论中从书中复制的引用并没有说明 T 需要成为安全类型。还是一头雾水。
    • 您是说从技术上讲您可以使用[FaultContract(typeof(DivideByZeroException))] 并且它对于非.NET 客户端是安全的,但您不应该因为 T 是 CLR异常它将包含堆栈跟踪和您不希望传播到客户端的其他信息?你说的是这个吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多