Проблемы частичной визуализации AJAX для страницы по умолчанию в IIS 7 при использовании настраиваемого модуля http - PullRequest
3 голосов
/ 12 мая 2010

Проблема

Когда я пытаюсь сделать запрос частичного обновления AJAX (с помощью элемента управления UpdatePanel) со страницы по умолчанию *1006* веб-сайта IIS7, он завершается неудачей - вместо возврата html, который будет обновлен, он возвращает всю страницу, которая затем заставляет Javascript MS AJAX создавать синтаксический анализ.

Предполагаемая причина

Я сузил причину до двух проблем - сделать запрос AJAX на странице по умолчанию, когда у меня зарегистрирован определенный пользовательский http-модуль. Запрос частичного рендеринга на http://localhost завершится неудачно, но запрос частичного рендеринга на http://localhost/default.aspx будет работать нормально. Кроме того, если я удалю следующую строку в моем пользовательском HttpModule:

_application.PreRequestHandlerExecute += OnPreRequestHandlerExecute;

Частичный рендер AJAX будет работать правильно. Странно, да?

Еще одна странная вещь ... Если я посмотрю на trace.axd, то увижу, что при сбое запроса частичного рендеринга два запроса POST регистрируются для одного запроса частичного рендеринга - тот, где страница default.aspx выполняется успешно (регистрируется такая информация трассировки, как page_load), но контент не создается, а секунда, которая, по-видимому, фактически не выполняется (информация трассировки не регистрируется), но создает контент (HTTP_CONTENT_LENGTH больше 0).

Пожалуйста, помогите! Если бы кто-нибудь с хорошим знанием модулей HTTP или модуля MS AJAX Http мог объяснить, почему это происходит, я был бы очень благодарен. На самом деле очевидная работа заключается в том, чтобы просто перенаправить на default.aspx, если URL-адрес запроса равен "/", но мне бы очень хотелось понять, почему это происходит.

1 Ответ

1 голос
/ 23 июня 2011

Прежде всего PreRequestHandlerExecute выполняется точно перед выполнением обработчика HTTP.

Во-вторых, для размещения сайтов с HttpModules под IIS7 лучше, чтобы мы запускали сайт в режиме интегрированного конвейера, а также нам нужно переместить тег HttpModules в web.config в раздел модуля system.webServer.

Если, например, вы измените обработчик в PreRequestHandlerExecute следующим образом:

void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
    HttpApplication application = (HttpApplication)sender;
    HttpContext context = application.Context;

    if(  something-happened  )
         context.Handler = null;
}

Результат будет именно таким, как вы сказали.

Установка обработчика для чего-либо другого, кроме его по умолчанию, означает, что ASP.Net не отвечает за текущий запрос.

Обратите внимание, что в каждом запросе может быть только один HttpHandler.

...