在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是否会影响代码的安全性。