2009-10-13 99 views
1

我正在使用NetTcp綁定與某些WCF服務通信的項目。當第一次開始了我們採取的其他應用程序做WCF通過調用一個不好的做法,比如下面:WCF錯誤記錄

EntityObject sample = new ServiceProxy().GetEntity(); 

直到我們意識到WCF是抱着到即使aspx頁面已被髮送到連接的工作太棒了客戶端(我天真地認爲會清理任何連接)。雖然連接被阻止導致事情最終放緩,但ELMAH記錄了任何錯誤並向我們發送了完整的堆棧跟蹤。爲了解決性能問題,我們改爲:

using (ServiceProxy proxy = new ServiceProxy()) 
{ 
    sample = proxy.GetEntity(); 
} 

這使得表現搖滾比較。這種方法的缺點是每當代理收到錯誤時,ELMAH唯一可以捕捉到的就是現在的通道出現故障。然後,我們必須深入挖掘日誌(使用sharedListener設置WCF的)來判斷髮生了什麼,如果是序列化錯誤,儘管偵聽器在客戶端和服務器上都設置了,但實際發現它的可能性要低得多。我已經探索了IErrorHandler接口,並且將爲它添加對我們的服務的支持,但是我想知道是否有其他方法可以從WCF中獲取詳細的錯誤,而不是僅僅說錯誤,並且沒有真正的信息來說明爲什麼故障。如果它在序列化它可以告訴我們的對象時死亡,這將是特別有益的。爲什麼它不能序列化。

回答

1

好了,你可以告訴WCF servive不僅僅是「什麼糟糕的事情發生」使用serviceDebug行爲發回的更多信息。

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ExceptionDetails"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

只要是開發/測試環境或內部應用程序,就可以。但實際上,應該在服務器端捕獲(並記錄)服務錯誤 - 您的接口是IErrorHandler

客戶端需要處理客戶端異常,如TimeoutExceptionCommunicationException來處理安全異常或網絡故障等。只是標準的.NET異常處理,真的。

此外,using()通常是一個好主意 - 但不一定在這裏,因爲當ServiceProxy被處置時(在using() {}塊的末尾),您可能會遇到異常,並且不會被捕獲在這種情況下。您可能只需要爲您的服務代理使用try {...} catch {...} finally {...}區塊。

Marc

+0

我們實際上使用了includeExceptionDetailInFaults標誌,並且異常返回到了調試中,但是由於代理服務器出現故障,我們最終看到的是它在沒有任何附加信息的情況下發生故障。 try/catch可能是一個選項,但現在改變一切肯定不會很有趣。儘管如此,我仍需要探索一下。 – RubyHaus 2009-10-13 19:39:27