【问题标题】:WCF FaultException inconsistencyWCF FaultException 不一致
【发布时间】:2016-07-02 13:35:16
【问题描述】:

我有一个 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&lt;FileNotFoundException&gt; 可以正常工作,而FaultException&lt;MyException&gt; 不行?

如果我从MyException 中删除Exception 继承,一切都会正常运行(但我想要一致性,所以我希望它是一个实际的例外)。保留Exception继承没有变化,但是用[DataContract]装饰。

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

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

【问题讨论】:

  • 如果您可以发布不起作用的异常类的实际代码,这将有所帮助。它看起来像什么?
  • 它看起来和我发布的 (MyException) 完全一样。唯一的区别是类的名称。

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


【解决方案1】:

您的例外应该是[Serializable]。我认为这已经解决了你的问题。

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

【讨论】:

  • 我在这样做时遇到了一些其他问题,但至少问题中的原始错误消失了,所以我会认为这是答案。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多