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 одинаковым для всех серверов.

Другие вопросы по тегам