2011-11-02 56 views
3

所以我試圖在具有多個AppDomain的應用程序中設置一個記錄器。我想在內存中爲所有記錄的消息創建一箇中央存儲。我決定使用名爲管道綁定的WCF,並創建了一個log4net appender,它創建一個通道並將所有日誌事件發送到主服務。跨應用程序域的多個服務實例

問題是我似乎得到每個AppDomain中的服務的新副本,因此我的單個日誌最終成爲多個日誌。

的設置是我有一個服務合同接口,ILogSink,和單身(單身實際和InstanceContextMode在服務行爲屬性設置爲單)服務實現ResultLog它可以對記錄的消息的集合。在我的父AppDomain中,我實例化ServiceHostResultLog,並打開該服務。然後我附上一個Appender WcfResultAppender,它具有通過ChannelFactory CreateChannel調用(到服務主機地址)創建的代理副本ILogSink。在啓動時,每個子AppDomain都會創建它自己的WcfResultAppender副本。

我對WCF很陌生,我錯過了什麼?

編輯:我還沒有收到任何好的迴應 - 我已經把問題放在一邊,但它是一個迫切的需要。看起來好像我在每個應用程序域中都獲得了不同的服務類副本,並且出於某種原因數據仍留在這些對象中。我預計後臺會有一些東西使用綁定來解決在主AppDomain中創建的服務,並通過該服務傳遞數據,但其他事情正在發生。我已經閱讀了無數WCF的解釋和例子 - 我注意到的一件事是沒有一個例子提供保留數據的服務。但是,我仍然無法找到任何與我的期望相矛盾或確認的東西。

+0

你是如何託管你的單身人士? –

+0

暫時有一個處理程序類,它具有對單例服務以及單個AppDomain的引用。我正在實例化單例以及處理程序中的服務主機。最終,我會重構這個以啓動並託管這個級別以上的單例,但現在我正在使用一個創建的處理程序/ appdomain進行測試。 – badlander

回答

1

每個AppDomain都是一個孤立的環境,它們之間沒有直接的交互作用。

考慮通過IIS或WAS公開您的服務,它將在其自己的(單個)AppDomain中運行它。如何在IIS中託管WCF服務的詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ms733766.aspx

有關如何在WAS中託管WCF服務的詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ms733109.aspx

希望這會有所幫助。

+0

我想我誤解了一些關於它如何工作的基本知識。我的期望是,我設置了一個服務來監聽指定的管道位置,然後通過命名的管道uri打開一個到該服務的通道,並獨立於任何應用程序域甚至應用程序連接到該服務。如果情況不是這樣,你能解釋一下真正的情況嗎?如果客戶依賴於情境,這似乎會破壞獨立服務的目的...... – badlander

+0

@badlander ServiceHost類允許您在未將其託管在IIS或WAS中時公開服務[link](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.servicehost.aspx)它不知道哪個其他服務實現當前被託管在另一個AppDomain中。您正在爲每個AppDomain創建和託管單個服務實例。 –

+0

@badlander對於WCF上的有用資源,請參閱http://stackoverflow.com/tags/wcf/info –

0

考慮使用消息隊列作爲日誌消息的存儲