WCF FaultException不一致

时间:2016-03-16 15:09:45

标签: c# .net wcf exception exception-handling

我有一个WCF服务,当出现问题时会抛出FaultExceptions。抛出的一些错误类工作得很好,但是其他一些错误类没有工作并且给出以下错误:

  

接收到http://localhost/MyService的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止了HTTP请求上下文(可能是由于服务关闭)。

内部异常说

  

基础连接已关闭:接收时发生意外错误。

我的代码如此有效:

服务器

public Stream DoSomething() {
    if (someCondition) {
        if (fileExists) {
            return new Stream(); // I know I can't do this, but for example purpose only :)
        }
        throw new FaultException<System.IO.FileNotFoundException>(new FileNotFoundException());
    }
    throw new FaultException<MyException>(new MyException());
}

异常类

public class MyException: Exception
{
}

客户端

try {
    wcfClient.DoSomething();
} catch (FaultException<FileNotFoundException>) {
    // This works just fine
} catch (FaultException<MyException>) {
    // This gives the error listed above
}

在合同中设置了FileNotFoundException和MyException:

[FaultContract(typeof(FileNotFoundException))]
[FaultContract(typeof(MyException))]

为什么FaultException<FileNotFoundException>按预期工作,但不是FaultException<MyException>

如果我从Exception删除MyException继承,一切正常(但我想要一致性,所以我希望它是一个实际的例外)。如果保留Exception继承,则没有任何更改,但它使用[DataContract]进行修饰。

为什么? FileNotFoundException也继承自Exception。一个有效,另一个无效。令人沮丧!

P.S。:服务器和客户端共享接口和类定义的相同程序集,因此不应存在任何合同不匹配。

1 个答案:

答案 0 :(得分:1)

您的例外应该是[Serializable]。我认为这样可以解决你的问题。

作为best practice for Exceptions,您还应该实现三个构造函数。