2010-01-21 64 views
4

我剛讀這great article由文龍東WCF的ChannelFactory緩存。WCF的ChannelFactory緩存

我的問題很簡單,你怎麼能真正證明的ChannelFactory實際上是在調用之間被緩存?我遵循了有關ClientBase構造函數的規則。我們正在利用我們的對象以下重載的構造函數,自ClientBase繼承:

ClientBase(字符串endpointConfigurationName,的EndpointAddress remoteAddress);

在上面提到的文章中指出:

對於這些構造,所有參數 (包括默認的)都在 以下列表:

·的InstanceContext callbackInstance

·串 endpointConfigurationName

周·的EndpointAddress remoteAddress

只要這些三個參數 同當ClientBase是 構建,我們可以有把握地認爲 相同的ChannelFactory都可以使用。 幸運的是,字符串和 EndpointAddress類型是不可變的,即我們可以簡單比較 確定兩個參數是否與 相同。對於InstanceContext,我們可以使用 對象引用進行比較。所述 類型EndpointTrait因此用作MRU高速緩存的密鑰 。

爲了測試我們正在檢查例如哈希碼在ClientBase構造函數中的ChannelFactory緩存理論var testHash = RuntimeHelpers.GetHashCode(base.ChannelFactory);

哈希值是調用這讓我們覺得的ChannelFactory是不實際緩存之間的不同。

有什麼想法?

問候

邁爾斯

+0

當使用object.ReferenceEquals進行身份檢查時,你會得到相同的結果嗎?我有點懷疑以非虛擬方式調用object.GetHashCode,因爲我不知道它的實現細節) –

+0

我遇到了同樣的問題,我實際上使用的構造函數聲明它不會緩存但時機正在顯示,否則。看起來,即使是構造它的狀態它不會緩存嗎?我們怎麼才能真正知道ChannelFactory被緩存了? –

回答

0

我也有這個問題,我得到非常快速的性能時,我保存了多個呼叫代理對象。

我真正想要的是能夠創建和使用代理每次調用,但緩存和優化發生在幕後。

像你一樣,我遵循微軟建議的指導方針,包括將我的綁定配置移出代碼並放到一個.config文件中(我不想這樣做)。

我覺得這是應該由微軟的架構來處理,它就像我的交易性能的代碼質量感覺太多。如果有的話,他們應該爲我們提供了一個構造函數,允許緩存,而不必在的.config存在...

1

我知道這個問題是有點老了,但因爲沒有答案,如果有人有相同的問題:

你所提到的文章:

內部通道之前(透明代理)創建了 後,如果訪問其他公共屬性(如ChannelFactory,Endpoint, 和ClientCredentials),則當前ClientBase的緩存邏輯可以禁用 。

這意味着調用ChannelFactory.GetHashCode()ClientBase<IService>實例實際上導致禁用緩存。

+1

好點...但是沒有使用GetHashCode,我們怎麼才能真正證明ChannelFactory被緩存在兩次調用之間?我的原始問題文本:「我的問題只是如何證明ChannelFactory實際上是在兩次調用之間緩存?」 –