Сеанс ASP.NET потерян, но только для одного конкретного пользователя
У меня есть приложение ASP.NET, которое работает на двух серверах с балансировкой нагрузки. Все работает нормально, за исключением одной группы клиентов. Все эти клиенты приходят из одной компании. Случайно выдается необработанная ошибка NullReferenceException. Это происходит в случайное время в случайных местах. Кажется, что сессия просто полностью прошла. так как это происходит только для определенной группы пользователей, я должен предположить, что это как-то связано с их средой. Я видел пользователей, которые приходят с IE6, IE7, IE8 и FF, и это ошибка возникает во всех случаях.
Я не уверен на 100%, как решить эту проблему. У кого-нибудь есть какие-либо идеи?
РЕДАКТИРОВАТЬ: Сессия установлена на "InProc"
<sessionState mode="InProc" cookieless="false" timeout="20" />
4 ответа
Я связался с пользователем, у которого была проблема. Я попросил его открыть браузер и зайти на whatsmyip.org и сказать, что там написано, что это его IP-адрес. Затем я попросил его обновить экран несколько раз. Ну, разве вы не знаете, IP-адрес изменился. Он продолжал переключаться между двумя разными IP-адресами. Это был не IP-адрес его машины, а двух разных прокси. Каждый запрос может прийти один или другой видимо.
Наш балансировщик нагрузки (что-то под названием Zeus - я не сетевой парень) был настроен на установление сходства сеансов (так называемые липкие соединения) с использованием IP-адресов. Мы изменили настройки так, чтобы балансировщик нагрузки сбрасывал cookie и использовал его для поддержания сеанса, и теперь все работает правильно.
Сеанс InProc не разделяется между серверами, поэтому похоже, что эта группа пользователей перемещается с одного сервера на другой, а остальные нет. Может быть, ваш балансировщик нагрузки пытается добиться "зависания" сеансов, используя что-то вроде IP-адреса или чего-то еще, и эта организация блокирует эту информацию.
Если ваша балансировка нагрузки основана на направлении каждого попадания на наименее загруженный сервер, то InProc не будет работать. вам нужно будет использовать режимы StateServer или SQLServer.
Представьте, что первое попадание от клиента направлено на сервер A - который запускает новый сеанс на сервере A. Второе попадание от того же клиента может перейти на сервер B, предоставляя файл cookie сеанса от сервера A, который сервер B не распознает.
Если у вас есть балансировка нагрузки "липкая" (или привязка к клиенту), когда первое попадание выделяется для наименее занятого сервера, но затем последующие попадания из того же сеанса направляются на тот же сервер, то InProc все равно должен работать.
Если вы используете SQL для хранения состояния сеанса, убедитесь, что все серверы в ферме смотрят на одну и ту же базу данных SQL - я был пойман этим ранее, и потребовалось немало времени, чтобы разобраться с этим!
Изменить: На самом деле вам может потребоваться установить его StateServer
как вы работаете в веб-ферме. Посмотрите это о режимах Session-State от MSDN.