2016-02-29 73 views
2

我開發了一個WCF服務,用於組織的以太網中的消費。
該服務目前託管在Windows服務上,並使用net.tcp綁定。
在服務中定義了2 operation contracts
連接到此服務的客戶端是長時間運行的Windows桌面應用程序。
員工(> 30,000)通常有這位客戶從星期一早上到星期五晚上一整個星期運行。
我應該在每次服務調用後打開並關閉我的WCF客戶端嗎?

在此生命週期中,根據主桌面客戶端上的某個用戶操作,可能會有多次調用wcf服務。 讓我們在主要桌面應用程序的每3個動作中就說1個,即 會觸發對我們服務的呼叫。

現在,我們正計劃部署每個員工的桌面
這個窗口服務我也使用`autofac`作爲依賴解析器容器。
我的WCF服務實例上下文是`PerSession`,但理想情況下我們的客戶端和服務都在同一臺桌面上運行(現在),因此我計劃使用`autofac`容器爲每個新會話注入相同的服務實例。
現在我沒有更改服務實現 上的`InstanceContext`屬性,因爲將來我可能會在不同的主機環境中部署相同的服務,我希望每個會話都有一個新的服務對象實例。

就像前面提到的,客戶端是一個長期運行的桌面應用程序,我已閱讀,這是一個很好的做法,`Open`和`Close`每個呼叫的代理,但如果我離開的服務成爲PerSession會爲每個呼叫創建一個新的服務實例,這可能不是必需的,因爲服務和客戶端都有1-1映射。
另一個說法是,我打算在此環境中爲每個會話注入相同的實例,因此每個服務調用的打開和關閉應該不重要?
那麼我應該採取哪種方法,爲每個呼叫提供服務`Singleton`並打開關閉或 當桌面應用程序加載/第一次服務呼叫時打開客戶端代理,然後僅在桌面應用程序關閉時關閉它?

+0

當我的意思是通過注入相同的單個實例,我說的是注射相同的服務實例每次打開由客戶端代理調用,我不注入客戶端代理的單例實例。 –

回答

4

我的WCF服務實例上下文PerSession,但在理想情況下,我們有客戶端和服務在同一桌面上運行(目前),所以我打算注入相同的服務實例使用autofac每個新會話容器

一般要避免共用一個WCF客戶端代理,因爲如果它的故障變得難以推動(或你的情況重新注入)新的WCF的代碼共享代理的那些部分。最好爲每個演員創建一個代理。

現在不改變服務實現了InstanceContext屬性,因爲在將來,我可能會部署在不同的主機環境相同的服務,我想有一個新的服務對象實例爲每個會話

我認爲這裏可能會有些混亂。InstanceContext.PerSession意味着每個WCF客戶端代理創建一個服務器實例。這意味着每次你使用new MyClientProxy()時都會有一個服務實例,即使你與其他10個被代理單例注入的對象共享它也是如此。這與您如何託管它無關。

就像前面提到的,客戶端是一個長期運行的桌面應用程序,我已閱讀,這是一個很好的做法,OpenClose代理爲每個呼叫

不正確的。對於非常昂貴的PerSession服務。在建立與服務的鏈接方面存在可測量的成本,更不用說創建工廠的開銷。 PerSession服務是每會話的原因,這意味着服務是維持呼叫之間的狀態。例如在我的PerSession服務中,我喜歡在構造函數中建立一個昂貴的數據庫連接,然後可以在以後的服務調用中快速使用它。本例中的打開/關閉實質上意味着一個新的服務實例與新的數據庫連接一起創建。慢!

加上共享一個注入其他地方的客戶端代理,無論如何都會破壞注入代理的目的。更不用說在一個線程中關閉它會在另一個線程中導致潛在的錯誤。再次請注意,我不喜歡共享代理的想法。

另一種說法是,我打算注入每個會話相同的實例在這種環境下,所以打開&關閉每一個服務調用應該沒有關係?

是的,就像我說的,如果你要注入,那麼你不應該叫開/關。然後再次您不應該分享在多線程環境中。

那麼哪種方法應該帶

遵循這些準則

  1. SingletonPerCallPerSession?這完全取決於你的服務的性質。它是否在方法調用之間共享狀態?做它PerSession否則你可以使用PerCall。不想多次創建一個新的服務實例,並且您希望在方法調用之間可選地共享全局變量/單個變量?讓它成爲一個Singleton

  2. 而不是注入WCF客戶端代理的共享具體實例,而是注入一個機制(工廠),當被調用時允許每個收件人在需要時創建自己的WCF客戶端代理。

  3. 每次通話後都不要打開/關閉,不管服務實例模式如何,都會損害性能。即使你的服務基本上是計算僅,重複開/關,用於在Singleton服務的每個方法調用仍然緩慢,由於客戶端代理

  4. 處置的客戶端代理儘快時不再的開辦費需要。PerSession服務實例保留在服務器上,在客戶端代理的整個生命週期內耗盡寶貴的資源,或者直到超時(以較早者爲準)。

  5. 如果你的服務是localmachine,那麼你認爲NetNamedPipeBinding它運行在內核模式;不使用網絡重定向器,速度比TCP快。後來,當你部署遠程服務,添加TCP結合

I recommend this awesome WCF tome

enter image description here

+0

優秀的答案謝謝 –

+0

@TomRedfern謝謝你好先生:) – MickyD

+0

感謝您的回答...對不起,如果不清楚..當我補充注射我的意思是注入每個會話相同的服務實例,而不是一個單身客戶端代理;就像你提到的那樣非常糟糕。 –

相關問題