双向WCF服务操作不返回任何回复而不是异常

时间:2010-10-15 20:06:04

标签: wcf

我有两种不同的WCF服务,主要执行基本的CRUD操作。对于这两种服务,无论客户端如何,如果服务引发异常,则不会将异常返回给客户端。实际上,我能看到实际异常的唯一方法是打开服务中的跟踪并查看跟踪文件。

无论抛出异常,都是如此。例如,如果我发送的字符串值的长度大于我的服务绑定配置允许的长度,它将生成一个NetDispatcherFaultException异常,并带有以下消息,如预期的那样:

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:newItem时出错。 InnerException消息是'反序列化Organization.Division.Application.Service.AddNewItem类型的对象时出错。 读取XML数据时已超出最大字符串内容长度配额(8192)。通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性,可以增加此配额。第1行,位置20157。'。

问题是服务不返回此异常,而是服务抛出带有异常消息的ArgumentNullException:

值不能为空。
参数名称:message

...我的客户端只是给了我这个错误(无论我的客户端是ASP.NET网页,WCF测试客户端还是其他人都是如此):

无法调用服务。可能的原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。有关更多详细信息,请参阅堆栈跟踪。您可以尝试通过启动新代理,还原到默认配置或刷新服务来进行恢复。
错误详细信息:
收到对http://localhost/Services/MyAwesomeS3rv1c3/DoSomethingGrrreat.svc的HTTP响应时出错。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

当我查看服务跟踪时,我也看到此警告:请求/回复操作AddNewItem没有回复消息。

我假设我正在做一些系统错误的事情,因为无论引发的基础异常,多个服务以及每个服务的多个方法都会发生这种情况。我只是无法辨别出问题所在。我只想将错误返回给客户端。

有关其他背景信息,我在服务的web.config中的<serviceBehavior><behavior>...下设置了以下设置:

<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>

...我正在使用wsHttpBinding和mex绑定。

最后,这似乎是一个相当近期的行为变化(即客户端用于查看服务抛出的实际异常)。我只是无法弄清楚可能有什么东西。

2 个答案:

答案 0 :(得分:1)

就我而言,我使用企业库来记录异常。日志记录的配置显然不正确。但是,WCF服务跟踪没有透露这一点。

跟踪确实显示了正确处理/捕获的基础异常(无论是SQL错误还是其他错误)。在那之后,ServiceChannel莫名其妙地被关闭了。生成ArgumentNullException,因为没有要返回的回复消息。

所有这一切都是因为底层异常的错误处理中的异常,它从未在跟踪中显示过。调试服务显示,Microsoft.Practices.EnterpriseLibrary.Logging.Logger.Write实际上正在抛出自己的异常,该异常未处理并从视图中隐藏。修复该异常(或者只是暂时关闭日志记录)解决了这个问题。

只是表明有时跟踪不够好,你仍然需要调试。

答案 1 :(得分:0)

如果我没记错的话,我认为这取决于异常发生的时间:I.e。在您的情况下,配额异常在管道中发生得太早,而来自客户端的传入消息仍然被反序列化 - 因此服务器只是中止连接,因为它根本不认为传入消息是有效请求(因为它无法反序列化,所以从它的角度来看,没有什么可以回复的。