在WCF上抛出exception的正确方法

我试图以最通用的方式在WCF上发送exception。 这是我得到的:

[ServiceContract] interface IContract { [OperationContract] void Foo(); } class ContractImplementation: IContract { public void Foo() { try { Bar(); } catch (Exception ex) { throw new FaultException(ex, ex.Message); } } } 

实际上来自Bar的例外是:

 [Serializable] class MyException : Exception { // serialization constructors } 

我在服务器端WCF日志记录中看到的错误是:

键入“MyException”,数据协定名称为“MyException: http : //schemas.datacontract.org/2004/07/MyException ”。 考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 – 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

到目前为止我尝试了什么:

 [ServiceKnownType(typeof(MyException))] [ServiceContract] interface IContract { [FaultContract(typeof(MyException))] [OperationContract] void Foo(); } 

但没有运气。

首先,在MyException中,从Exception中删除inheritance并将其公之于众。

其次,当您声明服务合同时,请按以下方式声明exception:

 [FaultContractAttribute( typeof(MyException), Action = "", Name = "MyException", Namespace = "YourNamespace")] [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] [OperationContract] void Foo() 

最后,您可以像这样抛出您的exception:

 throw new FaultException ( new MyException(ex.Message), new FaultReason("Description of your Fault") ); 

希望能帮助到你。

首先 – 道歉,我宁愿发布这个评论而不是答案。 作为一个相对的菜鸟,我无法做到!

本文详细讨论了如何将exception详细信息转发回来: http : //www.codeproject.com/Articles/799258/WCF-Exception-FaultException-FaultContract

Afaik,您实际上无法将exception本身传递回客户端,因为exception不符合SOAP。 还要考虑传递整个exception是否会影响代码的安全性。