2010-02-09 65 views
4

我創建了一個WCF服務,其中ServiceHost類不能實例化爲單例。我需要監視與此服務的每個連接,甚至在首次調用與之關聯的方法之前。實際上,我想記錄客戶何時打開一個通道與服務進行通信。可能嗎? 在網上我發現只有兩種解決方案:如何監視客戶端與WCF服務的連接?

  1. ServiceHost的對象必須被服務器實例化,並作爲一個單身。然後我必須提供一個由客戶端調用的初始方法來註冊它自己的服務。
  2. 使用性能監視器顯示與該服務相關的計數器。

(1)和(2)都不滿足我的需求,因爲我想創建自己的應用程序,正如我之前所說的,我不能使用單例模式。 你有沒有遇到過這種問題?你是如何管理它的?

最後但並非最不重要的是,我還需要監視對服務提供的每種方法的調用。有沒有辦法做到這一點? 任何幫助將不勝感激。

+0

這有幫助嗎? http://stackoverflow.com/questions/711611/fire-event-when-client-connects-to-wcf-hosted-endpoint – ujjb 2014-02-13 22:04:24

回答

4

這有很多問題。

首先,調用WCF服務的首選方法是每個呼叫模型,例如,你的客戶端將調用一個服務方法,這會導致在服務器上創建一個服務類的實例,執行相關方法,然後再次處理該服務實例。所以你不能真正監控客戶端連接本身 - 它們在呼叫執行時只存在一秒鐘。

另外,在性能計數器之外,服務器端實際上沒有太多的基礎設施來監視每秒的呼叫等。新的服務器插件產品(以前稱爲「都柏林」(當前稱爲「AppFabric」))應該會在該領域帶來不少改進(可管理性) - 請參閱此MSDN article for more info

但即使在今天,您也可以設想自己接受服務類,並監視該類的實例化和銷燬。該服務類別還有一個指向ServiceHost的鏈接,該鏈接通過OperationContext.Current.Host屬性實例化 - 因此您可以設想以某種方式向主機發信號通知已創建新的服務類實例。只有一個東西可以成爲單個主機對象,這樣才能工作,但是需要在ServiceHost上有一個經過充分考慮並經過充分測試的多線程安全方法(您可以創建自己的定製ServiceHost來實現類似的功能)。

這可能是「監視我的服務」方向的一個步驟。至於性能監控 - 爲什麼現有的幾十個WCF性能計數器不能幫助您或爲您提供所需的信息?

+0

謝謝你的回答,但你提出的解決方案不符合我的要求。服務類的構造函數僅在調用其中一種服務方法時調用,而不在客戶端連接到服務時調用。我需要這種信息。任何想法? – 2010-02-10 08:54:31

+0

客戶端與服務「連接」與正在實例化的服務類相同.....客戶端沒有連接到服務器或什麼東西 - 當一個調用進來時,ServiceHost實例化服務類並調用方法 - 這就是所有...... – 2010-02-10 12:05:19

+0

對不起,我認爲誤解是由於我對WCF的瞭解不多。我試圖用另一種方式來描述我需要的東西。 當我寫「當客戶端連接到服務時」我的意思是「當客戶端調用open方法時」,然後在調用服務提供的方法之前。 我認爲應該有一種方法來檢測這個操作。 – 2010-02-10 13:02:45

相關問題