在WCF上抛出异常的正确方法

时间:2015-06-30 12:25:34

标签: c# .net wcf

我正在尝试以最通用的方式在WCF上发送异常。这就是我所拥有的:

[ServiceContract]
interface IContract
{
    [OperationContract]
    void Foo();
}

class ContractImplementation: IContract
{
    public void Foo()
    {
        try
        {
            Bar();
        }
        catch (Exception ex)
        {
            throw new FaultException<Exception>(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();
}

但没有运气。

2 个答案:

答案 0 :(得分:2)

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

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

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

最后,你可以抛出你的异常:

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

             );

希望它有所帮助。

答案 1 :(得分:0)

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

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

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