2013-01-14 63 views
1

正如問題所述。目前我們將WCF客戶端代理(ChannelFactory準確地)緩存到每個會話的服務中。這工作正常。但是現在我們已經轉移到Azure,並且有多個實例(會話)。我現在獲得了AppFabric會話狀態。所以會話由Azure提供,但現在問題在於緩存通道工廠。由於工廠不是[Serializable],因此看起來不能存儲在Session []中。有什麼選擇?應該在每次調用WCF服務方法時重新創建頻道?在Azure上的ASP.NET中緩存WCF ChannelFactory或客戶端代理?

[1.以前的工作狀態; 2.新嘗試的解決方案; 3.回退選項]

  1. WCF客戶端 - > ASP.NET - >會話緩存廠 - >頻道 - > WCF服務
  2. WCF客戶端 - > ASP.NET - >不能儲存工廠! - >頻道 - > Azure角色WCF服務
  3. WCF客戶端 - > ASP.NET - >新頻道的每個呼叫 - > Azure角色WCF服務

更新:我們已經建立,它贏得了」可以緩存(共享)ChannelFactory。所以問題仍然存在,我如何共享憑據(UserNameCredentials),因此它們現在不被共享,並且必須以某種方式分佈在分割實例中。顯而易見的選擇是將加密的憑據存儲在緩存中?這是個好主意嗎?有沒有其他方法可以做到這一點?

這將繼續作爲一個新的問題:How to share WCF client credentials...

回答

1

如果你想緩存的ChannelFactory,你將需要有每Azure角色實例會議之一。你不應該在會話中共享CacheFactories,因爲它們可能支持不同的用戶。

正如您所說的,CacheFactory不可序列化,因此您無法將其放入分佈式緩存中。

緩存它的一半原因是爲了避免CacheFactory的設置時間(可能是幾十毫秒)。序列化進出緩存的時間可能比CacheFactory的規模相當大。

+0

感謝您的快速響應。我同意,但在哪裏存儲憑據呢?它們存儲在一個ChannelFactory中,現在它被分成多個實例。除了可能的小開銷之外,它本身並不是一個問題。我是否應該將證書加密爲可序列化的結構並將它們存儲在Azure中的會話變量中,並共享這些信息?這是安全的嗎(在Azure服務器上)?什麼是最好的方法? – SmartK8

+0

@ SmartK8。如果您有每個實例存儲的憑據副本,是否有問題?我不認爲你需要把它們放到分佈式緩存中,因爲它們不是必須的,它們在實例之間共享不是必需的? –

+0

@ SmartK8。當我分享channelFactor時,你對我有不同的用例。在我的情況下,我沒有使用Windows身份驗證,所以不需要每個會話都有一個channelFactory(如此)。我所做的是創建一個包含每個服務接口的ChannelFactory的靜態字典 - 因爲我試圖避免每次調用實例化channelFactory的設置開銷以允許創建我的頻道。 –