IIS - различная обработка документа по умолчанию в режиме интегрированного конвейера? - PullRequest
2 голосов
/ 27 февраля 2009

У меня есть HTTP-модуль для обработки аутентификации с Facebook, который отлично работает в классическом конвейерном режиме.

Однако в режиме интегрированного конвейера я вижу дополнительный запрос для документа по умолчанию, который вызывает сбой модуля. Мы смотрим на запрос (от Facebook), чтобы получить и проверить пользователя, доступ к нашему приложению. Первоначальный запрос аутентифицируется нормально, но затем я вижу запрос second , в котором отсутствуют опубликованные переменные формы и, следовательно, происходит сбой аутентификации.

В режиме интегрированного конвейера запрос http для "/" приводит к двум запросам AuthenticateRequest подряд:

  1. Запрос, где AppRelativeCurrentExecutionFilePath = "~ /"
  2. Запрос, где AppRelativeCurrentExecutionFilePath = "~ / default.aspx"

Этот второй запрос теряет все значения формы, поэтому он не может аутентифицироваться. В классическом режиме этот второй запрос является единственным, и он сохраняет значения формы.

Есть идеи, что здесь происходит?

ОБНОВЛЕНИЕ: Вот изображение трассировки от уведомлений модуля в IIS. Обратите внимание, что мой модуль, FBAuth, видит AUTHENTICATE_REQUEST несколько раз (я бы ожидал 2 - один для аутентификации и один для поставторизации, но я получаю 4).

События вызваны несколько раз

Я начинаю верить, что это как-то связано с конфигурацией модуля / фильтра, потому что я обнаружил (Vista) окно с тем же кодом, который не запускает эти события многократно - он ведет себя как ожидалось. Я пытаюсь выяснить, в чем может быть разница ...

Спасибо! Том

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Нашли решение? Мое было добавить следующий код в конце Application_BeginRequest:

if (Request.RawUrl.TrimEnd('/') == HostingEnvironment.ApplicationVirtualPath.TrimEnd('/'))
    Server.Transfer(Request.RawUrl+"Default.aspx", true);
0 голосов
/ 27 февраля 2009

DefaultHttpHandler не поддерживается, поэтому приложения, опирающиеся на подклассы DefaultHttpHandler не сможет обслуживать запросы Если ваша заявка использует DefaultHttpHandler или обработчики которые происходят от DefaultHttpHandler, он не будет работать правильно. В Интегрированный режим, обработчики получены из DefaultHttpHandler не сможет передать запрос обратно в IIS для обрабатывать, а вместо этого обслуживать запрашиваемый ресурс в виде статического файла. Интегрированный режим позволяет модули ASP.NET работать на все запросы без требующий использования DefaultHttpHandler.

Обходной путь

Измените ваше приложение на использование модули для обработки запросов для всех запросов вместо использования сопоставление по шаблону для сопоставления ASP.NET со всеми запросы, а затем с помощью DefaultHttpHandler производные обработчики для передать запрос обратно в IIS.

Хм, или это может быть проблемой.

ASP.NET модули в раннем запросе этапы обработки будут видеть запросы что ранее могло быть отклонено IIS до входа в ASP.NET, который включает в себя модули, работающие в BeginRequest видит анонимные запросы за ресурсы, которые требуют модули аутентификации ASP.NET могут работать на любых этапах трубопровода, которые доступны для собственных модулей IIS. Из-за этого просит ранее, возможно, был отклонен в этап аутентификации (например, анонимные запросы на ресурсы, которые требует аутентификации) или другое этапы до входа в ASP.NET могут запустить модули ASP.NET. Такое поведение дизайн для того, чтобы включить ASP.NET модули для расширения IIS во всем запросе этапы обработки.

Обход

Измените код приложения, чтобы избежать любые специфичные для приложения проблемы, которые возникают от просмотра запросов, которые могут быть отклонено позже во время запроса обработка. Это может включать изменение модули для подписки на конвейер события, которые возникают позже во время обработка запросов. http://learn.iis.net/page.aspx/381/aspnet-20-breaking-changes-on-iis-70/

...