2012-11-26 57 views
0

我將把我的ASP.NET MVC4應用程序作爲一個冗餘的Azure應用程序託管。在會話期間,該應用程序執行產生不可序列化的對象的計算昂貴的操作。對象的創建是可重複的;每次我需要該對象時,我都可以執行昂貴的操作,但我更願意只是在第一次執行操作並保存該對象以備後用。Azure內存中會話狀態?

我想在Azure中使用標準的分佈式會話狀態機制來存儲常用的會話狀態信息,但該機制要求會話數據是可序列化的。我可以使用另一種機制來緩存昂貴的創建,不可序列化的對象嗎?

鮑勃

回答

1

做這些對象都被存儲在集中存儲,也可以將它們存儲在「是InProc」會話狀態?

如果沒有,恐怕你需要將它們序列化成SQL Azure,文件,應用程序結構緩存等。

因此,要麼找到一種方法,它們序列弄成持久化或將它們存儲在RAM中,有一個額外的副本每個Web服務器上

+0

謝謝伊戈雷克!不,我不需要集中存儲(顯然需要序列化)。我正在尋找一些東西,可以根據需要在每個服務器實例上構建我的對象,並只保留本地副本以便在該服務器實例上重用。我是新來的整個網絡編程的東西,所以我需要幫助弄清楚如何映射「InProc會話狀態」和「將它們存儲在RAM中」等基本術語映射到ASP.NET的魔術。 –

+0

這些對象是否對每個會話都是全局的?如果是這樣,您可以在公共靜態類中使用公共靜態聲明來聲明這些聲明(使用lock()語句包裝它們的設置以防止出現多線程問題)。 http://stackoverflow.com/questions/5118610/asp-net-mvc-global-variables – Igorek

+0

迷人。好的,讓我確保我理解這一點:我的web應用程序(無論是由Azure託管還是由某人的ASP.NET託管服務託管)都運行在一個或多個服務器實例的上下文中。每個服務器實例在啓動時加載一次我的程序集,並將它們永久加載(或直到遇到不合時宜的結束)。因此,只要服務器存在,公共靜態數據就會存在。順便說一句,確保靜態數據訪問是線程安全的。 (接下來的評論...) –

2

由Windows Azure中提供的所有分佈式緩存服務需要系列化目前,不僅共享緩存,但專用/共同定位緩存也是如此。

但是,如果您要在內存緩存中使用,則不需要序列化。但是這不利於擴展,並且如果只有一個實例,則可能無法獲得天藍色的SLA。

所以我的建議是優化你的序列化並嘗試使用azure緩存。