Asp.net 2.0 Метод нажатия кнопки работает в веб-саду противоречиво
У нас есть веб-приложение asp.net 2.0, работающее на IIS7. Он использует веб-сады и сервер состояний asp.net.
На странице есть много пользовательских элементов управления. На одном из пользовательских элементов управления мы добавили запись в журнал для события button_click, которое записывает строку в журнал при каждом запуске этого метода. Когда мы нажимаем кнопку, она только периодически отображает запись в журнале, указывая, что событие не всегда срабатывает при нажатии кнопки. Мы добавили запись в журнал, потому что мы подозревали, что метод нажатия кнопки не всегда работал, когда мы нажимали кнопку. Доказательства, которые мы видим, похоже, подтверждают наши подозрения.
Когда мы удаляем веб-сад и возвращаем сайт в один пул приложений, приложение возвращается в нормальное состояние - событие кнопки срабатывает каждый раз. Когда мы запускаем приложение на локальных машинах разработчика, оно также работает нормально.
Кто-нибудь еще видел такое поведение? Есть ли какие-либо рекомендации относительно следующих шагов, которые мы могли бы предпринять, чтобы сузить проблему?
РЕДАКТИРОВАТЬ: вот источник события в соответствии с просьбой:
protected void btnSearch_Click(object sender, EventArgs e)
{
Log.Error("Searching...");
SearchArgs args = CtrlToSearchArgs();
SessionManager.SearchQueryString = Request.QueryString;
string url = NavigationManager.BuildSearchUrl(args, null, "*** page url removed here ***");
if (args.PageSize.HasValue)
{
SessionManager.SetInSession(SessionManager.Key.SEARCH_PAGESIZE, args.PageSize.Value.ToString());
}
else
{
SessionManager.SetInSession(SessionManager.Key.SEARCH_PAGESIZE, "10");
}
SessionManager.SearchPanelData = url;
//Set the new args into the session
SessionManager.SearchControlArgs = args;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Redirect(url);
}
РЕДАКТИРОВАНИЕ № 2: Уточнение - эта установка не использует несколько серверов и не находится под балансировщиком нагрузки. Мы используем несколько AppPools на одном сервере.
3 ответа
Спасибо Фредди и Джейсону за публикацию ответов.
В процессе устранения неполадок мы решили вернуться к одному пулу приложений. В любом случае это казалось довольно неортодоксальным способом структурирования вещей. Однако это тоже не решило проблему.
Пройдя по кругу и попросив несколько человек просмотреть код, мы, наконец, обнаружили, что в сеансе хранится объект, содержащий статические переменные. Мы исправили эту проблему, и сайт начал работать как положено.
Установите ключ своего компьютера: http://msdn.microsoft.com/en-us/library/ms998288.aspx
Это не единственный сценарий сбоя, когда у вас не указан ключ компьютера, т. Е. Если пул приложений перезапускается, сгенерированный ключ компьютера изменяется, и вы получаете сбои во всем, что зависит от него, например, проверка состояния представления - одна, другая: ASP.NET MVC Проверка ViewState MAC не удалась
Вы, вероятно, хотите включить липкие сессии на вашем балансировщике нагрузки.
В прошлом я сталкивался с подобной ситуацией, когда страница отображалась сервером A, но обратная передача отправлялась на сервер B, что приводило к ошибке проверки обратной передачи.
В качестве альтернативы, вместо использования липкого сеанса вы также можете посмотреть, как вручную установить ваш MachineKey одинаковым для всех серверов.