Проблемы с частичным рендерингом AJAX для страницы по умолчанию в IIS 7 при использовании пользовательского модуля http

Проблема

Когда я пытаюсь сделать запрос на частичное обновление AJAX (используя элемент управления UpdatePanel) со страницы по умолчанию веб-сайта 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-адрес запроса равен «/», но я действительно хотел бы понять, почему это происходит.


person WiseGuyEh    schedule 12.05.2010    source источник


Ответы (1)


Во-первых, 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.

person Beygi    schedule 23.06.2011
comment
Поскольку я ушел с работы, я не могу сказать, исправит ли это мою (теперь уже довольно старую) проблему, но спасибо за ваш ответ, он был поучительным. - person WiseGuyEh; 14.09.2011