2010-04-26 68 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"];