2011-09-04 77 views
2

我在导致Web服务不可用的Web服务中出现奇怪的错误。它将返回一个错误如何调试此WCF Web服务? (“ServiceChannel处于故障状态”)

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

当我刷新应用程序池时,错误消失。我已经添加了一些调试日志记录(使用Log4net),但没有显示任何有用的信息。

事件日志中没有任何内容。

如何成功地调试该Web服务(已经超过2年的工作,突然开始使这些错误的)?

这是在C#/ .NET 3.5中。

更新: web服务只是从sql服务器(客户数据)中提取数据,将其包装在数据集中并将其发送回客户端。

* 更新2:*我想我发现错误:客户端没有关闭连接。这是否合理?

+1

饶宗颐这是这一个重复的问题:http://stackoverflow.com/questions/530731/how-to-make-sure-you-dont-get-wcf-faulted状态异常 –

+0

我没有使用using语句,但其他答案可能对我有帮助 – jao

回答

3

您可以使用该框架提供的System.ServiceModel.MessageLogging功能添加服务日志。它将记录所有内部WCF异常,这通常发生在比服务合约更高的级别上,因此您可能永远无法通过标准调试来看到它。

的错误已被记录后,将生产.svclog可以检查和分析利用Service Trace Viewer Tool

此功能已帮我解决问题,WCF,其中的根本原因是无法确定根据现有例外信息手工到客户端或服务器。例如,我有一个证书问题,它只是产生一条异常消息,沿着'客户端上的远程主机关闭了连接'的线路,并且服务器上完全没有异常。浏览服务器上的日志在不到3分钟内就指出了确切的问题。

将以下内容添加到您的app.config/web。配置(修改以适应您的需要)。这仅通过配置启用,即无需编程即可设置。

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
       <add name="messages" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\logs\messages.svclog" /> 
      </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 

<system.serviceModel> 
    <diagnostics> 
    <messageLogging 
     logEntireMessage="true" 
     logMalformedMessages="false" 
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" 
     maxMessagesToLog="3000" 
     maxSizeOfMessageToLog="2000"/> 
    </diagnostics> 
</system.serviceModel> 

More information found here

1

这可能是一个网络连接问题。看看here

它可能是您的服务时间太长来应对呢?它已经工作了2年的事实可能意味着你有太多的数据,你的服务不再能够足够快地查询它们。

如果你可以运行它的一些本地机器,它可能如果您安装了TCP/IP的监控工具,并看到确切的请求(和响应,如果你得到一个)帮忙。

如果它是一个SOAP Web服务试图通过了SoapUI运行它。

只是有些想法。

+0

我们最近从1Mbps升级到20Mbps。可能会导致问题? – jao

+0

不太可能。更高的带宽不会影响服务响应的时间。您应该记住,Web服务端的处理可能需要很长时间才能响应。你可以在你的web服务上发布更多信息吗? –

+0

webservice只需从sql服务器(客户数据)中提取数据,将其包装在数据集中并将其发送回客户端。 – jao

0

如果您可以在服务器上调试 - 或附加远程调试 - 尝试在工具禁用“只是我的密码” - >选项 - >调试和所有异常(CTRL-d,E)打破。你应该能够捕获WCF抛出的所有内部异常。

但是您的关于客户端关闭连接的评论听起来不错。 ClientBase中的IDisposable()实现存在一个错误(请参阅http://ardalis.com/idisposable-and-wcf)。