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

Tud*_*dor 6 .net c# 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实际出现的例外Bar是:

[Serializable]
class MyException : Exception
{
    // serialization constructors
}
Run Code Online (Sandbox Code Playgroud)

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

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

到目前为止我尝试过的:

[ServiceKnownType(typeof(MyException))]
[ServiceContract]
interface IContract
{
    [FaultContract(typeof(MyException))]
    [OperationContract]
    void Foo();
}
Run Code Online (Sandbox Code Playgroud)

但没有运气.

Ric*_*ual 3

首先,在 MyException 中,删除 Exception 的继承并将其设为 public。

其次,当您声明服务合同时,请声明例外情况,如下所示:

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

最后,你可以像这样抛出异常:

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

             );
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。