Я постараюсь быть максимально конкретным. Я унаследовал очень устаревший фильтр ISAPI C ++, который защищает классический веб-сайт ASP, и мне было поручено создать HTTPModule для его непосредственной замены.
Сначала я подключился к событию OnPreRequestHandlerExecute. Затем я успешно воссоздал вызовы сохраненных процедур, которые выполнял исходный фильтр ISAPI. Эти вызовы возвращают код состояния, который я вставляю в оператор CASE и, в зависимости от кода состояния, устанавливаю строковую переменную «перенаправления» (sUrl). Например, statusCode 15 установит sUrl в "/Session/Login.asp". Все это успешно работает.
Следующим шагом является собственно «перенаправление» страницы. В C ++ модуль делал следующее:
Headers.push_back(HeadersList::value_type("url", "/Session/Errors/SecurIDRequired.asp"));
Я пытаюсь воссоздать эту функциональность, используя следующее:
HttpContext.Current.RewritePath(sUrl);
Это работает на 100% для всех классических asp-страниц. Проблема возникает, когда пользователь пытается получить доступ к "http://somedomain.com/Blah.jpg Модуль успешно запускается, устанавливает правильный statusCode 15 и вызывается метод RewritePath, но не перезаписывает URL-адрес страницы входа.То же самое происходит с любой неклассической страницей ASP.
Поэтому я начал искать другие варианты вместо RewritePath и посмотрел на TransferRequest. Это выглядело многообещающе, поэтому я изменил код на:
HttpContext.Current.Server.TransferRequest(sUrl, true);
Теперь это направляет все запрошенные типы файлов на страницу входа, но происходят странные вещи. Во-первых, я получаю следующие ошибки на стороне клиента в FireBug:
синтаксическая ошибка https://somedomain.com/JS/jQuery/jquery.js Line 2
... некоторые другие ошибки javascript, связанные с jQuery. Я смотрю на панель Net, и она успешно загрузила библиотеку jQuery, поэтому я затрудняюсь с этим (этого не происходит с методом RewritePath).
Наконец, я попытался использовать старый добрый Server.Transfer и получил эту ошибку на стороне сервера:
Для типа запроса GET обработчик http не найден.
Фух! Надеюсь, мое объяснение было адекватным :)
Я предполагаю, что мой настоящий вопрос заключается в том, как лучше всего достичь того, что я пытаюсь достичь. Мне кажется, что метод RewritePath - лучший, любые советы будут очень признательны.
Ваше здоровье!
РЕДАКТИРОВАТЬ:
Обработчики, содержащиеся в файле web.config, следующие:
<httpHandlers>
<remove verb="*" path="*.asmx" />
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>