ASP.NET HttpModules & Server.Transfer / Server.TransferRequest / RewritePath проблемы - PullRequest
4 голосов
/ 12 февраля 2010

Я постараюсь быть как можно более конкретным. Я унаследовал очень устаревший 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>

Ответы [ 3 ]

2 голосов
/ 12 февраля 2010

Я не знаю, лучший ли это путь, но в качестве теста выполняет что-то вроде следующей работы?

В вашем HttpModule:

private void Application_BeginRequest(Object source, EventArgs e)
{
    HttpContext context = ((HttpApplication)source).Context;
    HttpRequest request = context.Request;
    if(request.Url.ToString().Contains("blah.jpg"))
    {
        context.RewritePath("~/login.aspx?");
    }
}
0 голосов
/ 13 сентября 2010

Человек, мне очень жаль тратить время каждого.

Оказывается, что базовая структура данных имела некоторые проблемы (разрешения не были установлены правильно). Из-за сложности реализованной модели безопасности я, должно быть, пропускал это снова и снова, пока, наконец, не осознал проблему. Должно быть, я смотрел на это 100 раз и не осознал этого!

Спасибо за все ответы и еще раз извините, ребята.

0 голосов
/ 12 февраля 2010

Похоже, что IIS не передает запросы на изображения в ASP.Net, который используется по умолчанию (IIS просто обслуживает изображения, как правило, без передачи их на страницу или что-либо еще).

Вы пытались сопоставить расширения изображений с вашим пользовательским обработчиком, либо в IIS, либо с помощью файла web.config?

...