2009-02-13 90 views
2

我遇到了一個奇怪的問題,我的WCF服務使用WS綁定。當我將它配置爲沒有會話時(安全/可靠),它工作得很好,但會話不會那樣。例如,當我使用安全性(消息安全性,Windows憑據)進行配置時,在第10次或第11次調用後,我會收到一個超時。我的服務調用另一個WCF服務,但是這兩個服務都配置了相同的綁定參數。如何調試WCF問題?

你會如何調試這樣的問題?除了打開跟蹤和使用SvcTraceViewer以外,您還會使用哪些工具?

回答

1

調試此類場景的最佳方法是激活WCF服務/客戶端中的跟蹤。跟蹤器創建日誌文件,您可以使用內置跟蹤查看器進行讀取。 http://msdn.microsoft.com/en-us/library/ms733025.aspx

+0

我在意識到跟蹤(請參閱最後一個paragrpah)。我的問題是還有別的。 – aogan 2009-02-13 17:27:43

+0

抱歉,錯過了您的評論。 但爲什麼你需要另一種方式? – dotmad 2009-02-13 18:12:31

3

一個失去大量的時間,同時開發WCF服務是綁定配置的最簡單的領域。對於初學者,請在源代碼存儲庫中備份您的工作配置。您可能還想爲在服務創建之前運行的配置文件本身添加驗證例程。

就調試這樣的WCF問題而言,確實沒有替代良好的舊Trace.WriteLine()寫入映射到文件,服務和客戶端上的TraceListener。但是,真的,考慮到你的問題是相當常見的,並且很可能是100%配置相關的,所以我建議你多瞭解綁定設置,特別是超時。將值設置爲任意高數字,甚至設置爲Timeout.Infinite數值(以字符串形式),這將實際上告訴WCF允許無限超時。然後,問問自己,爲什麼有些東西會超時,即使只是稍微改變了約束力,也不會這樣做。

關於您的特定問題,會話未被正確終止是因爲客戶端代理沒有通過顯式調用Close()方法正確關閉。在處理會話綁定時,您可能會擺脫這種情況,但除非關閉代理,否則會話將不會被釋放。這樣做的副作用是通常會達到10個併發會話的默認服務限制值。一旦瞭解了會話的生命週期,您可能需要查看可以在服務合同的方法上針對OperationContract屬性指定的IsInitiating,IsTerminating和IsOneWay屬性。

這裏有一些有用的資源:

OperationContract的:(不會陌生鏈接URL)
http://en.csharp-online.net/WCF_Services -OperationContract_Attribute

使用會話:
http://msdn.microsoft.com/en-us/library/ms733040.aspx

的簡便摘要WCF會話,實例化以及可靠的消息傳遞
http://www.pluralsight.com/community/blogs/aaron/archive/2006/02/27/19253.aspx

而且,正如布賴恩提到,我對節流問題的回答:
WCF Service Throttling

0

不要忘記調用。您客戶端的代理上的Close()方法。