WCF FaultException如果为ApplicationException </applicationexception>指定了内部异常,<applicationexception>将失败

时间:2014-03-17 02:47:07

标签: c# wcf faultexception

我一直在调试我新推出的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));
        }
    }

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

1 个答案:

答案 0 :(得分:2)

如果ApplicationException在没有FaultException<T>的情况下通过InnerException发送给客户,那么它仅作为string发送。但是,如果设置了InnerException,则会发送ApplicationException本身。

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

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