同步访问ASP.NET会话的成员

我正在构建一个Javascript应用程序,而eash用户有一个单独的UserSession。 该应用程序进行了一堆Ajax调用。 每个Ajax调用都需要访问用户的单个UserSession对象。

  1. 每个Ajax调用都需要一个UserSession对象。

  2. UserSession对象中的数据对每个用户都是唯一的。

最初,在每次Ajax调用期间,我都会创建一个新的UserSession对象,并且它的数据成员存储在ASP.NET Session中。 但是,我发现UserSession对象正在被大量实例化。 为了最小化UserSession对象的构造,我将其包装在Singleton模式中并对其进行同步访问。

我相信同步发生在应用程序范围内,但我只需要按用户进行。 我在这里看到一篇post说ASP.NET缓存是同步的,但是创建对象并将其插入缓存之间的时间另一个Thread可以开始构建它的另一个对象并将其插入缓存中。

这是我正在同步访问对象的方式。 有没有比使用“lock”更好的方法…应该锁定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; } } } } 

您不需要锁定会话状态访问权限。

会话状态的物理值在完成请求所需的时间内被锁定。 锁由HTTP模块在内部管理,用于同步对会话状态的访问。

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

通常,您不需要这种代码用于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"];