Синхронизация доступа к члену сеанса ASP.NET - PullRequest
4 голосов
/ 26 апреля 2010

Я создаю приложение Javascript, и у каждого пользователя есть отдельная пользовательская сессия. Приложение выполняет множество вызовов Ajax. Каждый Ajax-вызов требует доступа к одному объекту UserSession для пользователя.

  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;
            }
        }
    }
}

Ответы [ 2 ]

7 голосов
/ 26 апреля 2010

Вам не нужно блокировать доступ к состоянию сеанса.

Физические значения состояния сеанса блокируются на время, необходимое для выполнения запроса.Блокировка управляется внутренне модулем HTTP и используется для синхронизации доступа к состоянию сеанса.

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

1 голос
/ 26 апреля 2010

Как правило, такой код не требуется для доступа к сеансу asp.net, поскольку доступ к каждому сеансу ограничен одним пользователем.Единственная причина, по которой я могу подумать о блокировке доступа к вашему объекту сеанса, - это если вы ожидаете иметь несколько одновременных запросов ajax, и даже в этом случае, я думаю, asp.net синхронизирует доступ для вас.решите заблокировать, вам действительно нужно сделать это только если ваш объект сеанса имеет значение null:

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"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...