2011-09-04 132 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)。