WCF新手-是FaultException<;T>;对非.NET客户端安全吗?

WCF新手-是FaultException<;T>;对非.NET客户端安全吗?,wcf,Wcf,WCF新手警报。我正在读“学习WCF”和“编程WCF服务”,这两本书都建议抛出异常。如果T是.NET类型“DivideByZeroException”,并假设存在FaultContract [FaultContract(类型(除零例外))] 在方法“Divide”中,使用该WCF服务和方法的非.NET客户端是否能够理解和处理该.NET异常?如果是,是否因为类型信息(DivideByZeroException)是客户端有权访问和使用的元数据的一部分(因为FaultContract) 谢谢您的帮助。

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

[FaultContract(类型(除零例外))]

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


谢谢您的帮助。

您可以抛出一个
FaultContract
,但一般来说,您不应该这样做,正是因为您提到的原因(*)。通常建议使用异常信息(如异常消息)建立数据协定,然后使用该类型的
FaultContract

[DataContract]
public class MyErrorDetails
{
    [DataMember]
    public string ErrorCode { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
}
然后使用

[FaultContract(typeof(MyErrorDetails))]

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

我正在尝试验证您的答案。在“编程WCF服务”第208页的“故障”下,它说:
除例外情况外的基本问题是它们是特定于技术的,因此不应跨服务边界共享。为了实现无缝的互操作性,您需要一种将特定于技术的异常映射到一些中性错误信息的方法。此表示形式称为soap故障。。。若要引发soap错误,服务无法引发原始CLR异常。相反,服务应该抛出FaultException类的实例,如示例6-1所定义。
那么FaultException是否正常?是
FaultException
由WCF框架作为特例处理-它只会序列化故障契约中定义的信息(假设您在操作中声明了
[FaultContract(typeof(T))]
),这些信息是基于SOAP标准的。卡洛斯-你和我在msdn上有相同的线程,但我仍然不完全清楚。如果wcf服务抛出CLR DivideByZeroException,并且存在类似[FaultContract(typeof(DivideByZeroException))]的FaultContract,那么这对非.NET客户端安全吗?您对msdn的回复让我觉得它不安全,因为DivideByZeroException不是一种安全类型(它包含stacktrace和其他您不想向客户端公开的信息)。但我在上面的评论中从书中抄袭的引语并没有说我不需要成为一个安全的类型。仍然感到困惑。您是说您在技术上可以使用
[FaultContract(typeof(DivideByZeroException))]
并且它对于非.NET客户端是安全的,但是您不应该这样做,因为t是CLR异常,它将包含堆栈跟踪和其他您不希望传播到客户端的信息?你是这么说的吗?