2010-08-18 110 views
4

假設您從一個項目公開一個WCF服務,並使用'添加服務引用'(在這種情況下是一個Framework 3.5 WPF應用程序)在另一個項目中使用它。WCF客戶端連接緩存/池

當您重新實例化ClientBase派生代理時,ClientBase是否會執行任何類型的底層通道的連接池,或者您是否每次都會承擔與服務建立連接的全部開銷?我特別關心這一點,因爲我們使用wsHttpBinding來使用安全模式=「消息」。

回答

7

請看看this article,它介紹瞭如何緩存客戶端代理的最佳實踐。如果您直接創建代理(MyProxy p = new MyProxy(...)),那麼看起來您確實無法緩存底層的ChannelFactory,這是昂貴的部分。但是,如果使用ChannelFactory創建代理,ChannelFactory由代理在AppDomain級別緩存,並且基於您傳遞給代理的參數(類似於基於連接字符串的連接池)。

這篇文章通過了一些關於封面下的內容的細節,但重點是如果您使用ChannelFactory來創建代理而不是直接實例化,那麼您會遇到性能下降。

希望這有助於!

+0

什麼文章不說:代理超時​​取決於你的綁定!對於WSHttpBinding,默認超時時間爲10分鐘。 – Alex 2010-08-18 18:14:13

+0

不要忘記在你的wsHttpBinding上設置estabilishSecurityContext = false和negotiateServiceCredential = false。 – 2010-08-18 19:20:02

1

This article解釋說是的,有WCF的TCP連接池。它沒有解釋的是它在哪些情況下會生效。據我所知,只要您通過爲代理對象提供一個命名端點(IE不使用自定義對象)來構建代理對象,連接池就可以工作。我通過在我的web應用程序中加載負載並通過netstat檢查打開的TCP連接來測試此操作。

但是底線是你不需要緩存你的代理對象以重新使用TCP連接。

+2

因此,如果它通過端點名稱進行連接池,那麼這是否意味着通道工廠上的CreateChannel()方法在這種事件中速度非常快?每次新增ChannelFactory的時候,這仍然很慢嗎? – 2012-03-20 17:04:37