Я создаю приложение Javascript, и у каждого пользователя есть отдельная пользовательская сессия. Приложение выполняет множество вызовов Ajax. Каждый Ajax-вызов требует доступа к одному объекту UserSession для пользователя.
Для каждого вызова Ajax требуется объект UserSession.
Данные в объекте 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;
}
}
}
}