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));
}
}
谁能解释为什么如果设置了内部异常,这可能会失败?
当ApplicationException
不带InnerException
通过FaultException<T>
发送给客户端时,则仅作为string
发送。但是,当设置了InnerException
之后,就会发送ApplicationException
本身。
Exception
类型在。net中是可序列化的(它经常被错误地引用为不可序列化),然而,Data
属性的内容经常是不可序列化的。这将导致序列化问题,我相信您正在经历这个问题。
有一些解决这个问题的方法:您可以通过使用反射将Data
属性设置为null
,或者您可以创建自己的类。