我有两种不同的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绑定。
最后,这似乎是一个相当近期的行为变化(即客户端用于查看服务抛出的实际异常)。我只是无法弄清楚可能有什么东西。
答案 0 :(得分:1)
就我而言,我使用企业库来记录异常。日志记录的配置显然不正确。但是,WCF服务跟踪没有透露这一点。
跟踪确实显示了正确处理/捕获的基础异常(无论是SQL错误还是其他错误)。在那之后,ServiceChannel莫名其妙地被关闭了。生成ArgumentNullException,因为没有要返回的回复消息。
所有这一切都是因为底层异常的错误处理中的异常,它从未在跟踪中显示过。调试服务显示,Microsoft.Practices.EnterpriseLibrary.Logging.Logger.Write实际上正在抛出自己的异常,该异常未处理并从视图中隐藏。修复该异常(或者只是暂时关闭日志记录)解决了这个问题。
只是表明有时跟踪不够好,你仍然需要调试。
答案 1 :(得分:0)
如果我没记错的话,我认为这取决于异常发生的时间:I.e。在您的情况下,配额异常在管道中发生得太早,而来自客户端的传入消息仍然被反序列化 - 因此服务器只是中止连接,因为它根本不认为传入消息是有效请求(因为它无法反序列化,所以从它的角度来看,没有什么可以回复的。