HttpContext.RemapHandler должен изменить, какой обработчик обрабатывает запрос?

Документация MSDN гласит:

Метод HttpContext.RemapHandler - позволяет указать обработчик для запроса.

Я пытаюсь переместить обработку запроса от одного обработчика к другому в зависимости от условия в первом обработчике. Кажется, что метод HttpContext.RemapHandler инициализирует экземпляр второго обработчика, но не вызывает метод HttpHandler.ProcessRequest; ответ пуст.

Делает ли метод HttpContext.RemapHandler то, что, на мой взгляд, должен - перенести обработку в новый HttpHandler и вызвать метод HttpHandler.ProcessRequest? Или я должен использовать другой подход, такой как другой метод или HttpModule?

РЕДАКТИРОВАТЬ: Оказывается, я должен использовать HTTPHandlerFactory. У меня есть решение, работающее хорошо сейчас.

Так для чего именно HttpContext.RemapHandler?

1 ответ

Решение

Ты можешь использовать HttpContext.RemapHandler как вы указали, однако, если другой HttpHandler звонки RemapHandler (например, ASP.NET MVC, который регистрирует MvcHandler в PostResolveRequestCache) ваш IHttpModule никогда не будет стрелять Может быть поэтому IHttpHandler.Process никогда не звонил.

Если это ваша проблема, вы можете просто определить маршрут для игнорирования в MvcApplication.RegisterRoutes как это:

routes.IgnoreRoute("your_path/{*pathInfo}");

Кроме того, помните, что с сервером веб-разработки Visual Studio и IIS6, RemapHandler не будет работать.

Вот пример того, как выбрать правильный способ переназначения обработчика в зависимости от того, активирован ли Integrated Pipeline И все еще сможет получить доступ к сеансу:

public void Init(HttpApplication application)
{
  if (HttpRuntime.UsingIntegratedPipeline)
    // For IIS 7 and IIS 8
    application.PostAuthorizeRequest += Application_PostAuthorizeRequest;
  else
    // For IIS 6
    application.PostMapRequestHandler += Application_PostMapRequestHandler;
}

private void Application_PostAuthorizeRequest(object sender, EventArgs e)
{
    ((HttpApplication)sender).Context.RemapHandler(_myHandler);
}

private void Application_PostMapRequestHandler(object sender, EventArgs e)
{
    ((HttpApplication)sender).Context.Handler = _myHandler;
}

Разница между использованием HttpHandlerFactory а также HttpModule в этом случае, что последний позволяет вам решить, когда использовать какие IHttpHandler независимо от ASP.NET IHttpHandler отображения. Подробнее о MSDN: обработчики HTTP и обзор модулей HTTP.

Другие вопросы по тегам