2010-10-15 74 views
3

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

无论抛出什么异常,情况都是如此。例如,如果我发送的字符串值的长度大于我的服务的绑定配置所允许的长度,则会按照预期生成NetDispatcherFaultException异常并显示以下消息:

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

的问题是,这种异常不是由服务返回的,而是服务引发ArgumentNullException与异常消息:

值不能为空。
参数名:
未能调用:消息

...和我的客户只是给了我这个错误(我的客户是否是一个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

FWIW,我最近有完全相同的问题:找到它的唯一方法显然是使用WCF跟踪。幸运的是,在我的情况下,它发生在开发过程中。 – 2010-10-15 20:26:57

+0

感谢您的评论。没有WCF跟踪,我已经完全失去了!对于其他人,http://msdn.microsoft.com/en-us/library/ms732023.aspx详细介绍了如何设置跟踪。现在我只需要弄清楚如何让这些异常细节传递回客户端:-) – schellack 2010-10-15 21:14:12

回答

1

在我的情况下,我使用企业库来记录异常。记录的配置显然是不正确的。但是,WCF服务跟踪没有显示这一点。

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

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

只是表明有时跟踪不够好,而且您仍然必须能够进行调试。

+0

感谢您更新我们。 – 2011-04-26 19:50:51

0

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

+0

好想法。不过,我确实有同样的问题,但我不会认为*会在管道初期发生。例如,我的服务执行基本的创建操作,向数据库中插入一行,使用一对列作为具有唯一约束的唯一键。如果违反了这个约束(即,如果服务试图插入一个副本),那么抛出异常,如预期的那样。但是,WCF服务不会将此例外返回给客户端。 – schellack 2010-11-01 22:43:53

+0

你能打开WCF跟踪,捕获你描述的情况的痕迹,然后看看确切的异常(及其完整的堆栈跟踪)是什么? (使用WCF跟踪查看器工具) – 2010-11-01 23:13:39

+0

1示例异常是SqlTypeException:SqlDateTime溢出。堆栈跟踪:SqlTypes.SqlDateTime.FromTimeSpan(时间跨度值) SqlTypes.SqlDateTime.FromDateTime(DateTime值) SqlClient.MetaType.FromDateTime SqlClient.TdsParser.WriteValue SqlClient.TdsParser.TdsExecuteRPC SqlClient.SqlCommand.RunExecuteReaderTds SqlClient.SqlCommand .RunExecuteReader SqlClient.SqlCommand.RunExecuteReader SqlClient.SqlCommand.ExecuteReader SqlClient.SqlCommand.ExecuteDbDataReader Common.DbCommand.ExecuteReader Mapping.Update.Internal.DynamicUpdateCommand.Execute Mapping.Update.Internal.UpdateTranslator.Update – schellack 2010-12-17 17:07:44