2010-04-26 93 views
4

我正在構建一個Javascript應用程序,並且eash用戶有一個單獨的UserSession。該應用程序進行了一堆Ajax調用。每個Ajax調用都需要訪問用戶的單個UserSession對象。同步訪問ASP.NET會話的成員

  1. 每個Ajax調用都需要一個UserSession對象。

  2. UserSession對象中的數據對每個用戶都是唯一的。

本來,每個Ajax調用期間,我將創建一個新UserSession對象和它的數據成員被存儲在ASP.NET會話。但是,我發現UserSession對象正在被實例化。爲了最大限度地減少UserSession對象的構造,我將它封裝在Singleton模式中,並對其進行同步訪問。

我相信同步發生在應用程序範圍內,但我只需要它發生在每個用戶。我在這裏看到一篇文章說ASP.NET緩存是同步的,但是創建對象並將其插入到緩存中的時間另一個線程可以開始構建另一個對象並將其插入緩存。

這是我目前正在同步訪問對象的方式。有沒有比使用「鎖定」更好的方法...應該鎖定HttpContext.Session對象?

private static object SessionLock = new object(); 

public static WebSession GetSession 
{ 
    get 
    { 
     lock (SessionLock) 
     { 
      try 
      { 
       var context = HttpContext.Current; 
       WebSession result = null; 

       if (context.Session["MySession"] == null) 
       { 
        result = new WebSession(context); 
        context.Session["MySession"] = result; 
       } 
       else 
       { 
        result = (WebSession)context.Session["MySession"]; 
       } 

       return result; 
      } 
      catch (Exception ex) 
      { 
       ex.Handle(); 
       return null; 
      } 
     } 
    } 
} 
+0

爲什麼你需要一個單例模式?您已經在使用直接映射到您自己的會話對象的作用域/使用的會話狀態對象。 – kervin 2010-04-26 17:44:57

+0

我希望同一個用戶同時有多個請求。 – Sam 2010-04-26 19:03:53

回答

7

您不需要鎖定會話狀態訪問權限。

會話狀態的物理值鎖定了完成請求所需的時間。該鎖由HTTP模塊內部管理,用於同步對會話狀態的訪問。

http://msdn.microsoft.com/en-us/library/aa479041.aspx

+0

這篇文章是最有幫助的。 http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic3 – Sam 2010-04-26 19:05:10

+0

有關同步的部分回答了我的擔憂。 – Sam 2010-04-26 19:05:45

+0

很高興幫助! – kervin 2010-04-26 21:28:31

1

一般情況下,你不需要這種對asp.net會話訪問代碼,因爲訪問每個會話限制爲單個用戶。我可以考慮鎖定對會話對象的訪問權限的唯一原因是,如果您希望有多個同時發生的Ajax請求,即使如此,我認爲asp.net會爲您同步訪問權限。

如果你決定鎖定,你只真正需要做的,如果你的會話對象爲空:

if (context.Session["MySession"] == null) { 
    lock(SessionLock) { 
    if (context.Session["MySession"] == null) { 
     context.Session["MySession"] = new WebSession(context); // try-catch block removed for clarity (and my laziness) 
    } 
    } 
} 
return (WebSession)context.Session["MySession"];