c# - 通过 WCF 抛出异常的正确方法

标签 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 日志记录中看到的错误是:

Type 'MyException' with data contract name 'MyException:http://schemas.datacontract.org/2004/07/MyException' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

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

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

但没有运气。

最佳答案

首先,在 MyException 中,移除对 Exception 的继承并将其公开。

其次,当你声明你的服务契约(Contract)时,声明异常如下:

[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")

             );

希望对您有所帮助。

关于c# - 通过 WCF 抛出异常的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31138277/

相关文章:

java - android java消费vb.net wcf服务

c# - 将文件上传到远程服务器

c# - Environment.Exit() 导致我的应用程序在使用 Process.Start 后崩溃

c# - 在C#中,如何在编译时限制谁可以调用方法

java - Java 的 WCF 通讯器是什么?

c# - 需要全面的 C# System.Threading.Tasks 示例

C# 匿名函数递归

.net - 我怎样才能克服 Compat。 VS2005/8 解决方案文件有问题吗?

c# - 是否可以将重写方法标记为 final方法

c# - WCF 服务在 WebForm 中调用得太早?