2011-09-02 27 views
10

我有一個應用程序重複使用同一個WCF頻道。我通過一個工廠對象保留一個靜態引用。我想知道這是否是好的實踐,或者我應該打開x頻道並循環播放這些頻道上的所有服務呼叫,而不是使用單個頻道?單個WCF頻道的性能與多個頻道

如果只使用1個通道,這些服務調用是否排隊,或者當我使用x通道時會發生同樣的情況嗎?

回答

11

您應該爲所有請求使用單個通道工廠,但應爲每個請求構建不同的通道。切勿重用頻道。它們創建起來並不昂貴,而且不是線程安全的。渠道工廠的成本很高。它是線程安全的,可以重用。當然,如果渠道工廠進入故障狀態,您可能需要重新打開它。

+1

因此,等待_channelFactory.CreateChannel()返回的ICommunicationObject不是一個好主意嗎?我現在爲所有請求保留1個通道,我不爲每個呼叫做一個_channelFactory.CreateChannel(),而是重複使用第一次創建的靜態通道。 –

+1

@Bjorn Bailleul,根本不是一個好主意。 '_channelFactory.CreateChannel()'返回的實例應該儘可能的短,並且永遠不會被重用。正如我所說的,CreateChannel調用並不昂貴。它非常快。您可以爲每個請求調用它。什麼是昂貴的是渠道工廠的創建。這是你可以緩存的內容。 –

+1

@Darin - 您是否有參考或鏈接「爲每個電話使用不同的頻道」。此博客是關於渠道工廠的最多參考文章之一,其第一個最佳實踐是「重複使用相同的代理」: http://blogs.msdn.com/b/wenlong/archive/2007/10/27/performance -improvement-of-wcf-client-proxy-creation-and-best-practices.aspx – ErnieL

6

@Darin季米特洛夫

重複使用相同的代理 在很多情況下,你會想重複使用相同的代理服務器。這是最好的表現。當您使用安全功能時尤其如此,因爲最初的安全協商會帶來高成本。

代理等於頻道。如果你看一下this blog post,你可以看到下面的代碼片段:

ISimpleContract proxy = factory.CreateChannel(); 
((IClientChannel)proxy).Open(); 

而且,如果您打算使用會話工作,你不希望建立爲每個請求一個新的會話(通過創建一個新通道/代理每次)。