Вот уже около 4-5 месяцев у меня, кажется, возникает эта спорадическая проблема - в основном в наше самое загруженное время дня с 10:30 до 11:45, когда все мои веб-серверы Windows 2003 в кластере Microsoft NLB начинают сеанс ошибки сервера состояния. Ниже приведен образец ошибки.
System.Web.HttpException: Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same. If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection. If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.
at System.Web.SessionState.OutOfProcSessionStateStore.MakeRequest(StateProtocolVerb verb, String id, StateProtocolExclusive exclusiveAccess, Int32 extraFlags, Int32 timeout, Int32 lockCookie, Byte[] buf, Int32 cb, Int32 networkTimeout, SessionNDMakeRequestResults& results)
at System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem)
at System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Теперь я использую службу ASP.NET State на централизованном внутреннем сервере Windows 2003, с которым взаимодействуют все серверы.
Первоначально я использовал состояние SQL Server в течение пары лет, прежде чем возникла эта проблема. Проблема с SQL wqas заключалась в том, что при возникновении проблемы создавалась ситуация блокировки, которая существенно влияла на всех пользователей на всех серверах. Компания, производящая продукт, порекомендовала мне использовать стандартную службу ASP.NET State, так как она технически поддерживает ее. Я не понимаю, почему это будет иметь значение, но у меня не было выбора, кроме как попробовать!
Я попытался создать несколько пулов приложений, добавить дополнительные серверы, изменить время ожидания TCP / IP с 20 до 30 секунд и даже позвонить в службу поддержки Microsoft ASP.NET, но без особого успеха. Я даже рекомендовал им проверить, используют ли они состояние сеанса только для чтения вместо запроса чтения / записи на страницу - поскольку я понимаю, что это в основном заставляет каждую страницу совершать круговые обходы на сервер состояний, даже если состояние не используется на странице.
К сожалению, приложение разработано нашей продуктовой компанией, и они настаивают, что это что-то связано с моей средой, потому что у других клиентов нет таких проблем. Тем не менее, я разговаривал с другими клиентами, и они говорят мне, что когда они сталкиваются с подобными проблемами, им в основном приходилось создавать другую веб-ферму. Эта проблема выглядит так, будто я просто достиг некоторого архитектурного предела в приложении ...
Позиция Microsoft по этому вопросу заключается в том, что состояние сеанса необходимо уменьшить, а код возврата, возвращаемый сервером состояний, указывает на заполнение буферов.
Чтобы лучше понять объем проблем (а не ждать, пока клиенты позвонят и пожалуются), я установил ELMAH и настроил его для отправки мне электронных писем при возникновении необработанных исключений. В основном я получаю 500-1000 писем в период высокой активности!
Если у кого-то есть другие идеи, которые я мог бы попробовать, или лучшие способы устранения неполадок, я был бы признателен.
У нас начались проблемы с подключением приложений .net к удаленному серверу состояний .Net, когда был применен патч MS KB967723. Вы можете посмотреть, применен ли этот патч к веб-серверу, и попробовать откатить его.
Вы можете увеличить количество доступных TCP-портов (по умолчанию 5000). Я видел похожие проблемы (не с состоянием сеанса), вызванные недостаточным количеством портов.
Измерьте, сколько данных приложение хранит в состоянии сеанса для типичного сеанса, и захват пакетов между веб-сервером и сервером состояния, чтобы измерить общий объем данных во время пикового использования.