0

我需要訪問ASP.NET MVC 2應用程序的控制器中的用戶特定數據。我的控制器類有2種控制器方法:我可以使用HttpContext.Application而不是Session來存儲會話特定數據嗎?

[ControllerSessionState(ControllerSessionState.ReadOnly)] 
public class CalendarController : BasicController 
{ 
    [Authorize] 
    public ActionResult ControllerMethod1() 
    { 
     //reads session specific data 
    } 

    [Authorize] 
    public ActionResult ControllerMethod1() 
    { 
     //stores session specific data 
    } 
} 

我想請求被並行化,也就是ControllerMethod1應該能夠平行ControllerMethod2運行。爲此,我將會話標記爲ReadOnly。但是,ControllerMethod2必須將數據寫入「會話」。由於這是不允許的,我想將數據存儲在HttpContext.Application中。我可以用對象的名稱編碼用戶標識,例如:

HttpContext.Application["Data" + currentUser.UserId] = <<my_data>>; 

我可以這樣做嗎?這種方法有什麼缺點嗎?

+0

是的,有一個缺點:這種方法仍然沒有解決併發問題,並增加了處理自定義鍵的複雜性('「Data」+ currentUser.UserId') – GolfWolf

回答

1

對於顯然需要在會話存儲中寫入的控制器,請不要指定ControllerSessionState.ReadOnly

而是嘗試以另一種方式解決併發問題(例如,使用適當的鎖定機制)。

另外,請考慮同一用戶在同一時間訪問兩種方法的機率。我認爲這些可能性非常低,在這種情況下併發性不值得考慮。

+0

謝謝你的答案。爲了您的信息:我想並行執行控制器,因爲如果應用程序的用戶不想再等待結果,則使用一個控制器來停止第二個控制器的執行。 – curiosity

+0

它究竟如何阻止另一個控制器? – GolfWolf

+0

執行長時間運行操作的對象存儲在會話中(或在httpcontext.application中)。停止控制器調用此對象上的特定方法以停止操作。不幸的是,似乎sessionstate.readonly不會導致併發請求,正如我所預料的(也許這隻適用於ASP .NET MVC 3)。 – curiosity

相關問題