3

我一直在调试我新创建的 WCF 服务故障合同的一个问题,最后发现是什么破坏了它。

我这样定义服务:

[ServiceContract]

public interface IService1
{

    [OperationContract]
    [FaultContract(typeof(ApplicationException))]
    string GetData();
}

在我的服务中,我正在处理服务中的异常,如下所示:

    public string GetData()
    {
        try
        {
           // do stuff
        }
        catch(Exception e)
        {
            ApplicationException ae = new ApplicationException("oh dear!", e );
            throw new FaultException<ApplicationException>( ae, 
                                                 new FaultReason(ae.Message));
        }
    }

但是,客户端永远不会收到错误异常,而是会收到一个异常:

接收对...的 HTTP 响应时发生错误这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关更多详细信息,请参阅服务器日志

如果我像这样更改服务上的代码(即:在构造 ApplicationException 时不要设置内部异常),它会按预期工作。

    public string GetData()
    {
        try
        {
           // do stuff
        }
        catch(Exception e)
        {
            ApplicationException ae = new ApplicationException("oh dear!");
            throw new FaultException<ApplicationException>( ae, 
                                                 new FaultReason(ae.Message));
        }
    }

如果设置了内部异常,谁能解释为什么这可能会失败?我在文档中的任何地方都看不到它。

4

1 回答 1

2

当不ApplicationException通过 发送给客户端时,它仅作为 发送。但是,如果设置了,则会发送本身。FaultException<T>InnerExceptionstringInnerExceptionApplicationException

Exception类型在 .NET 中是可序列化的(它经常被错误地引用为不可序列化),但是,Data属性的​​内容经常是不可序列化的。这将导致我相信您遇到的序列化问题。

这个问题有一些解决方法:您可以使用反射将Data属性设置为null,也可以创建自己的类。

于 2014-03-17T19:49:51.523 回答