2012-06-28 39 views
1

我有一個應用程序使用JQuery顯示很多圖表和表格。其中一些圖表基於保存在會話中的變量(例如,用戶在另一個頁面中添加了一個值,並在下一頁中生成圖表,因此用戶請求不會發送任何參數)基於會話和自定義安全邏輯中的變量的MVC緩存

I是在網絡上環顧四周,大部分的解決方案都是基於

[OutputCache(Duration=60, VaryByParam="someParm")] 

問題是最我的要求不發的參數,他們只是使用在會話中的值。

有什麼辦法可以爲這些類型的請求啓用緩存嗎?

編輯:我們有一個複雜的安全要求,我們無法使用MVC的默認授權屬性。我們必須根據當前用戶+發送給動作的參數編寫邏輯,因此動作中的一個方法決定要麼繼續執行請求,要麼返回任何內容。這使得緩存非常困難,因爲在執行OutputCache時,我們只有參數,但上下文中的標識對象是空的。因此,如果具有管理權限的用戶發送a和b的請求,並且以最低權限發送對a和b的請求,則第二個人將看到結果,因爲該操作未運行,但是來自緩存已被使用!

爲了解決這個問題,我使用了getvarybyCustome。所有這些功能的作用是返回用戶的組名,這有助於創建更復雜的密鑰。最後一個示例中具有最低權限的人員將具有與管理員的請求緩存密鑰(a,b,group_admin)不同的緩存密鑰(a,b,group_less)。但是,爲每個請求獲取組名稱也很昂貴,所以我使用Cache對象來緩存用戶組,因此在會話開始時,用戶的組從AD中查詢並保存到緩存中,所以對於他/她以後的請求,他的組名是從緩存中檢索的。

回答

1

如果你不能通過VaryByParam達到目的,那麼你可以嘗試VaryByCustom。看一個例子here

+0

問題是GetVaryByCustomString被調用會話對象爲空:( – Reza

1

你可以重定向這個請求併發送給一個新的控制器方法發送會話參數,通過這種方式在未來的實現中可能會使用查詢字符串參數而不是會話,你的代碼將會也工作。

您可以在所有控制器的基類上創建一個將此會話參數轉換爲一次的轉換方法。