Очень необычное постоянство переменной ASP.net Session - PullRequest
0 голосов
/ 13 октября 2011

У меня действительно очень странная проблема с постоянством сеанса в ASP.net. Сначала несколько фактов:

Окружающая среда:

  • F5 Балансировщик нагрузки с включенными липкими сессиями:
  • Веб-серверы: 2 * Windows Server 2008 R2,
  • .net Framework Версия: 2.0.50727, IIS7,
  • Сервер базы данных: SQL Server 2008 R2
  • Протокол сеанса: сеансы ASP.net InProc, время ожидания установлено на 20 минут, cookieless = false
  • CMS: Ektron CMS 400.net

Хорошо, с проблемой.

У нас есть несколько пользовательских значений сеанса VB.net, которые устанавливаются на нашем веб-сайте для корзины покупок. время от времени некоторые из этих переменных, похоже, теряют постоянство. Я говорю некоторые, потому что основной сеанс остается постоянным. Я думаю, что главный виновник этот парень:

Shared Sub New()
    ' If the cart is not in the session, create one and put it there
    ' Otherwise, get it from the session
    If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then
        Instance = New ShoppingCart()
        Instance.Items = New List(Of CartItem)
        HttpContext.Current.Session("ASPNETShoppingCart") = Instance
    Else
        Instance = CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart)
    End If

End Sub

Даже если этот объект сеанса остается постоянным, он не отображается при выполнении трассировки:

, например

мои другие переменные сессий, такие как Session ("userId"), отображаются в трассировке, пока я НИКОГДА не вижу значения для Session ("ASPNETShoppingCart") - которое я считал странным - возможно, это потому, что это объект, а не строка?

Я исключил проблемы с балансировщиком нагрузки, обойдя его напрямую и вызвав код непосредственно на сервере.

Я знаю, что полный сеанс не уничтожается при возникновении проблемы, потому что я все еще вошел в систему, и другие значения сеанса отображаются на экране - но мои значения в корзине покупок не отображаются.

Кто-нибудь знает, что может вызвать что-то подобное? Есть ли способ защитить переменную сеанса или, по крайней мере, получить уведомление, если она меняет состояние, чтобы я мог отследить, что это вызвало?

1 Ответ

1 голос
/ 13 октября 2011

Действительно, странно, что «некоторые» переменные теряются, а некоторые нет.

Возможно, у вас есть какой-то «резервный» механизм, воссоздающий «UserID» (например, из cookie-файла аутентификации), и то же самое не происходит для других объектов.Я бы не стал использовать состояние сеанса InProc любой ценой, потому что всякий раз, когда рабочий процесс asp.net перерабатывается - и это может произойти в любое время - все в сеансе будет потеряно.Поскольку вы используете липкие сессии, я предлагаю вам переключиться в режим OutOfProcess, используя локальный StateServer.Вы можете прочитать подробнее здесь. Это очень просто настроить;просто измените файл Web.config и убедитесь, что на сервере запущена служба состояния ASP.NET.

Единственное предостережение: все ваши объекты должны быть сериализуемыми, но если вы не храните что-то экзотическоев Session все, что вам нужно сделать, это украсить ваши объекты атрибутом [Serializable].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...