2010-11-19 113 views
2

在典型的客戶端服務應用程序中,服務是WCF,如何使用服務引用?WCF客戶端 - 客戶端何時關閉通道

例如,您是否爲每個呼叫單獨實例化服務,還是打開一個服務器並在客戶端應用程序的整個生命週期中保留它? (當我引用'instatiating service'時,我的意思是實例化由svcutil創建的服務對象)

現在我們在客戶端上使用了一個服務實例,因爲它比總是創建,打開和關閉服務和每一個電話,但現在我徘徊,如果這是好的?我們採用這種方法的主要問題是發生超時(或者我們必須將會話打開10小時),連接中斷等,並且我們總是必須通過頻道執行'IsAlive'以確保一切正常......

如果它與應用程序有任何相關性,那麼該應用程序是單線程的,並且身份驗證是自定義構建的(通過將驗證令牌插入標頭)。綁定是basicHttp(或ws,對於這種情況並不重要)。

回答

1

就我個人而言,我更喜歡保持通道打開,直到方法調用返回並關閉它以釋放資源。這是所有人最清潔的方式。每次初始化代理實例都是毫秒級的事情,從不影響我的性能目標。

擁有某種ServiceClient單例是一個有趣的想法,但正如你所說,它帶有很多副作用,所以我不確定這是一個聰明的方法,但由於你的應用程序是單線程的,那麼它應該不是一個大問題,你可能會有一些輕微的性能優勢。

如果保存毫秒是關鍵任務,那麼您還可以擁有一個可從中獲取實例的ServiceClient池。

但是,第一種方法是最乾淨的。複雜性很差。

+0

你如何處理安全?我們在開通頻道之前進行身份驗證......或者您是否僅考慮網絡內的服務呼叫而不進行身份驗證? – veljkoz 2011-01-14 21:07:08

+0

正如veljkoz所說,如果您擁有安全通道,那麼每個客戶端代理初始化都非常重要。調用幾種方法將會提高性能。 – Artru 2011-09-14 11:25:34