Я постараюсь быть как можно более конкретным. Я унаследовал очень устаревший C ++ ISAPI-фильтр, который защищает классический веб-сайт ASP, и мне было поручено создать HTTPModule для его прямой замены.
Сначала я подключился к событию OnPreRequestHandlerExecute. Затем я успешно воссоздал вызовы хранимых процедур, которые сделал оригинальный фильтр ISAPI. Эти вызовы возвращают statusCode, который я добавляю в оператор CASE, и в зависимости от кода состояния устанавливаю строковую переменную redirection (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 Строка 2
... некоторые другие ошибки javascript, связанные с jQuery. Я смотрю на панель Net, и она успешно загрузила библиотеку jQuery, поэтому я в растерянности с этим (этого не происходит с методом RewritePath).
Наконец, я попытался использовать старый добрый Server.Transfer и получил эту ошибку на стороне сервера:
Не найден обработчик http для типа запроса 'GET'
Уф! Я надеюсь, что мое объяснение было адекватным:)
Полагаю, мой настоящий вопрос в том, как лучше всего достичь того, чего я пытаюсь достичь. Мне кажется, что метод RewritePath является лучшим, любые советы будут с благодарностью.
Ура!
EDIT:
Обработчики, содержащиеся в файле 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>