2009-11-19 68 views
1

我的asp.net應用程序部署在負載平衡系統上。我只想在整個會話中保留用戶的角色(一個字符串)。有人告訴我,asp.net中的會話信息存儲在數據庫中,所以我不希望asp.net引擎訪問DB ecah時間用戶在頁面之間切換。我也不想每次需要檢查用戶角色時從我自己的數據庫中獲取角色。我知道一種方法是將角色信息存儲在隱藏字段中。 什麼是存儲常量會話值的有效方式?什麼是存儲會話變量的有效方式

回答

1

會話有三種模式。模式設置支持三個選項:inproc,sqlserver和stateserver。你需要負載平衡,inproc自動出來。你可以配置使用sqlserver或者stateserver。

0

你也可以使用cookie。 會話數據默認存儲在內存中,所以我想您已將它配置爲存儲在數據庫中,以便在服務器場中的所有服務器上都可用。 如果你可以將其存儲在內存中,你可以使用這個方法來處理負載均衡:

if (Session["Role"] == null) 
    Session["Role"] = GetUserRole(); 

這將導致在前往數據庫每個服務器只有一次。

有關會話狀態here的更多詳細信息。

+1

在SQL模式下,整個會話字典從每個請求讀取一次並寫入數據庫。這使得在多個服務器之間保持同步變得容易,但是以這些額外的DB讀取和寫入爲代價。 – RickNZ 2009-11-19 03:28:24

0

如果「角色」與權限有關,將其存儲在隱藏字段或其他方式中可能會使其能夠從客戶端進行編輯,例如在視圖狀態下通過說話asp 。淨。

我對會議很討厭,特別是如果你正在使用它來提高性能。您可能真正想要的是緩存,並且您可以查看許多優秀的解決方案。您可以立即利用內置於asp.net中的緩存數據字典並作爲頁面類中的成員公開。緩存將基本上將您放入它的任何內容序列化並將其存儲在內存中。使用緩存對象最適合單個服務器設置。由於您正在使用加載協議,因此您可能希望利用分配緩存系統(如MemcachedAppFabric Caching(以前的代號名稱Velocity))。 Memcahed被許多大型網站如Twitter所使用,AppFabric是一種新的微軟產品,剛剛上市,但應該對其他微軟技術如Asp.Net提供良好的支持和整合。

利用分佈式緩存,您可以避免返回數據庫,並且基本上可以將其交換到緩存。這對於初學者來說更有效的原因是緩存只需要擔心有效存儲最近訪問的項目,因爲數據庫必須存儲所有項目。

另外我想指出的是,如果您使用服務器關聯與負載平衡器,則可以選擇避免分佈式緩存路由。從技術上講,你可以在沒有服務器關聯的情況下使用它,但是你將會有更多的緩存未命中。

1

如果您想避免數據庫訪問,您可以使用cookie來存儲用戶的角色而不是會話狀態。如果出於安全原因(可能使用會話ID作爲密鑰的一部分),您可以對cookie進行加密/編碼。在負載均衡的情況下,Cookie可以正常工作,因爲每次請求時瀏覽器都會將它們發送到服務器。只要確保在cookie上設置路徑屬性(可能還有HttpOnly),就可以限制瀏覽器附加到的URL。

請注意,如果您使用內置的ASP.NET成員資格提供程序,那麼提供程序會自動爲您處理角色成員身份和相關詳細信息。

相關問題