Сеанс ASP.NET потерян, но только для одного конкретного пользователя - PullRequest
0 голосов
/ 09 июля 2010

У меня есть приложение ASP.NET, которое работает на двух серверах с балансировкой нагрузки. Все работает нормально, за исключением одной группы клиентов. Все эти клиенты приходят из одной компании. Случайно выдается необработанная ошибка NullReferenceException. Это происходит в случайное время в случайных местах. Кажется, что сессия просто полностью прошла. так как это происходит только для определенной группы пользователей, я должен предположить, что это как-то связано с их средой. Я видел, как пользователи заходили с IE6, IE7, IE8 и FF, и во всех случаях возникает ошибка.

Я не уверен на 100%, как решить эту проблему. У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: для сеанса установлено значение «InProc»

<sessionState mode="InProc" cookieless="false" timeout="20" />

Ответы [ 4 ]

1 голос
/ 24 июля 2010

Я связался с пользователем, у которого была проблема. Я попросил его открыть браузер и зайти на whatsmyip.org и сказать, что там написано, что это его IP-адрес. Затем я попросил его обновить экран несколько раз. Ну, разве вы не знаете, IP-адрес изменился. Он продолжал переключаться между двумя разными IP-адресами. Это был не IP-адрес его машины, а двух разных прокси. Каждый запрос может прийти от одного или другого, очевидно.

Наш балансировщик нагрузки (что-то под названием Zeus - я не сетевой парень) был настроен на установление сходства сеансов (например, липких соединений) с использованием IP-адресов. Мы изменили настройки так, чтобы балансировщик нагрузки сбрасывал cookie и использовал его для поддержания сеанса, и теперь все работает правильно.

1 голос
/ 09 июля 2010

Сеанс InProc не распределяется между серверами, поэтому похоже, что эта группа пользователей перемещается с одного сервера на другой, а остальные нет. Может быть, ваш балансировщик нагрузки пытается выполнить «липкие» сеансы, используя что-то вроде IP-адреса или чего-то еще, и эта организация блокирует эту информацию.

0 голосов
/ 09 июля 2010

Если ваша балансировка нагрузки основана на перенаправлении каждого попадания на наименее загруженный сервер, то InProc не будет работать.вам нужно было бы использовать режимы StateServer или SQLServer.

Представьте, что первое обращение от клиента направлено на сервер A - это запускает новый сеанс на сервере A. Второе попадание от того же клиента может перейти на сервер Bпредоставление файла cookie сеанса с сервера A, который сервер B не распознает.

Если у вас балансировка нагрузки «липкая» (или привязка к клиенту), когда первое попадание выделяется для сервера с наименьшей нагрузкой, нозатем последующие попадания из того же сеанса направляются на тот же сервер, тогда InProc все равно должен работать.

0 голосов
/ 09 июля 2010

Если вы используете SQL для хранения состояния сеанса, проверьте, что все серверы в ферме смотрят на одну и ту же базу данных SQL - я уже был пойман на этом ранее, и потребовалось немало времени, чтобы разобраться !

Edit: На самом деле вам может потребоваться установить значение StateServer при работе в веб-ферме. См. Это о режимах состояния сеанса из MSDN.

...