我一直在调试我新推出的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));
}
}
任何人都可以解释为什么如果设置了内部异常,这可能会失败?我无法在文档中的任何地方看到它。
答案 0 :(得分:2)
如果ApplicationException
在没有FaultException<T>
的情况下通过InnerException
发送给客户,那么它仅作为string
发送。但是,如果设置了InnerException
,则会发送ApplicationException
本身。
Exception
类型在.NET中是可序列化的(它经常被错误地引用为不可序列化),但是,Data
属性的内容通常不可序列化。这将导致序列化问题,这是我认为您正在经历的问题。
此问题有一些解决方法:您可以使用反射将Data
属性设置为null
,也可以创建自己的类。