Http-модули вызываются при каждом запросе при использовании mvc / routing module - PullRequest
2 голосов
/ 03 октября 2009

Я разрабатываю модуль http, который подключается к модулю FormsAuthentication через событие Authenticate.

Во время отладки я заметил, что модуль (и все другие зарегистрированные модули) получает удар каждый раз, когда клиент запрашивает ресурс (также когда он запрашивает изображения, таблицы стилей, файлы javascript (и т. Д.)). Это происходит как при работе на сервере IIS 7 в режиме интегрированного конвейера, так и при отладке через сервер webdev (в режиме неинтегрированного конвейера)

Поскольку я разрабатываю веб-сайт с большим количеством изображений, которые обычно не кэшируются клиентским браузером, он будет поражать модули много раз.

Я использую MVC и его механизм маршрутизации (System.Web.Routing.UrlRoutingModule). При создании нового веб-сайта атрибут runAllManagedModulesForAllRequests для раздела IIS 7 (system.webServer) по умолчанию устанавливается в true в файле web.config, что, как следует из названия, заставляет его вызывать все модули для каждого отдельного запроса.

Если для атрибута runAllManagedModulesForAllRequests задать значение false, никакие модули не будут вызываться.

Кажется, что причина этого кроется в модуле маршрутизации или mvc (не знаю точно, почему), что приводит к тому, что обработчик asp.net (aspx) никогда не вызывается, и поэтому события и модули никогда не вызывают ( только один раз, как предполагалось).

Я проверил это, пытаясь вызвать «mydomain.com/Default.aspx» вместо просто «mydomain.com/», и он правильно вызывает модули только один раз, как и предполагалось.

Как это исправить, чтобы он вызывал модули только один раз, когда запрашивается страница, а не когда запрашиваются все другие ресурсы?

Есть ли какой-нибудь способ, которым я могу зарегистрировать, что все запросы должны запускать обработчик asp.net (aspx), кроме запросов для определенных расширений типов файлов? Конечно, это не решит проблему, если я выберу URL-адреса, например / content / images / myimage123 для изображений (без расширения). Но я не могу придумать какой-либо другой способ исправить это.

Есть ли лучший способ решить эту проблему?

Я попытался настроить ignoreRoute, например, такие маршруты. IgnoreRoute ("content / {* pathInfo}"); где папка содержимого содержит все изображения, javascript и таблицы стилей в отдельных подпапках, но, похоже, ничего не меняет.

Я вижу там много разных возможностей при настройке обработчика, но я не могу понять, как можно настроить его, который позволит использовать модуль маршрутизации и иметь URL-адреса, такие как / blog / post123 и не вызывать модули при запросе изображений, javascript и таблиц стилей (и т. д.).

Надеюсь, кто-нибудь может мне помочь?

Martin

Ответы [ 2 ]

0 голосов
/ 04 марта 2014

Следующий код - это то, что я использую в каждом приложении MVC, чтобы избежать издержек, вызванных системой маршрутизации при обслуживании статических файлов, javascript, css и т. Д.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = false;
    routes.LowercaseUrls = true;
    routes.AppendTrailingSlash = true;
    routes.IgnoreRoute("Content/{*pathInfo}");
    routes.IgnoreRoute("Scripts/{*pathInfo}");
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

    /* ... */
}
0 голосов
/ 04 апреля 2010

Кажется, проблема в модуле маршрутизации.

Решение состоит в том, чтобы переместить изображения, css, js в поддомен, или, возможно, вы можете зарегистрировать, какие типы / расширения файлов должен игнорировать модуль маршрутизации.

...