WCF FaultException< ApplicationException>如果为ApplicationExcep

本文关键字:如果 ApplicationExcep ApplicationException FaultException WCF | 更新日期: 2023-09-27 17:50:44

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

谁能解释为什么如果设置了内部异常,这可能会失败?

WCF FaultException< ApplicationException>如果为ApplicationExcep

ApplicationException不带InnerException通过FaultException<T>发送给客户端时,则仅作为string发送。但是,当设置了InnerException之后,就会发送ApplicationException本身。

Exception类型在。net中是可序列化的(它经常被错误地引用为不可序列化),然而,Data属性的内容经常是不可序列化的。这将导致序列化问题,我相信您正在经历这个问题。

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