【问题标题】:Synchronizing Access to a member of the ASP.NET session同步对 ASP.NET 会话成员的访问
【发布时间】:2010-04-26 17:33:57
【问题描述】:

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

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

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

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

我相信同步正在整个应用程序范围内进行,但我只需要每个用户进行同步。我在这里看到一个帖子说 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;
            }
        }
    }
}

【问题讨论】:

  • 为什么需要单例模式?您已经在使用直接映射到您自己的会话对象的范围/用途的会话状态对象。
  • 我希望同一个用户同时有多个请求。

标签: c# asp.net synchronization


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

一般来说,您不需要这种代码来进行 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"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多