2011-01-10 190 views
11

我有一個WCF webservice,充當我的ASP.NET網頁的數據提供者。重複使用WCF服務客戶端

整個網頁呼叫的數量對Web服務通過自動生成的ServiceClient製作。

目前我創建一個新ServiceClient並打開它爲每個請求即獲取用戶,獲取角色,獲取客戶名單等....它們中的每一個將創建一個新ServiceClient並打開一個新的連接。

我可以讓我的ServiceClient類全局或靜態地提供類,這樣在我的ASP.NET頁面的所有功能可以使用相同的客戶端。這似乎更有效率。這樣做有什麼問題嗎?我在做這件事時應該考慮的任何建議?如果我讓多個請求的客戶機

會發生什麼?大概它是同步的,所以如果我打1或50個電話,它應該沒有關係?

感謝

回答

7

當使用會話(帶有安全上下文或可靠會話的wsHttp)或連接(net.tcp,net.pipe)的綁定時,必須處理您的代理以您想要處理會話的方式進行。因此,如果您共享代理,則所有調用都將在單個WCF會話中處理(默認由單個服務實例處理)。但是你必須處理更多的複雜性,例如:未處理的服務異常將終止你的頻道,並且以下來自客戶端的調用將導致異常。

當會話少HTTP綁定(basicHttp,webHttp)使用你可以分享你的代理,甚至使其靜止。每個呼叫都是分開處理的,例外的服務不會對通道造成故障,並且它是透明的reuses opened HTTP persistent connections。但正因爲如此,創建新代理/頻道應該沒有大的開銷。

所以我的建議是:當你需要在你的ASP.NET應用程序多次打電話給在單個請求處理你的服務,使用相同的代理/通道。但不要在不同請求之間共享代理/頻道。

1

我想用ChannelFactory可以把你的問題。如果我是對的ChannelFactory有你的連接池並重新使用頻道。這樣做的好處是,渠道不會每次都安裝,只有第一次。

在這裏閱讀更多:ChannelFactory

要處理,你需要一些特殊的處理,因爲信道可以拋出異常在處置通道中的設置我寫了一個映射器來處理這個問題,你可以在這裏閱讀:http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

+0

難道這不是簡單地爲每個請求創建一個新的連接,而不是通過一個連接接通我的所有請求嗎? – Chris 2011-01-10 10:13:24