Запросы на статические файлы попадают в управляемый код в ASP.NET MVC3

Создавая пользовательские модули IHttpModules, я понял, что запросы на статические файлы (например,.css и .js файлы) попадают в управляемые модули. Вероятно, фотографии имеют одинаковую проблему. Не следует ли IIS обходить ASP.NET для файлов, которые существуют в файловой системе?

Например:

public class MyModule:IHttpModule
{
    public void Dispose(){ }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
    }
}

И я объявляю это следующим образом:

<modules runAllManagedModulesForAllRequests="true">
  <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>

Но, даже используя предварительное условие, я вижу, как статические файлы проходят через модуль:

Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js

Я попытался игнорировать правила для статических файлов, но это не имеет значения:

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

Это обычное дело? Или я чего-то не хватает? Насколько мне известно, если IIS запрашивает статический запрос на файл. Если мой управляемый модуль ударяется, значит, поток потока CLR ThreadPool обрабатывает этот запрос, правильно?

С уважением.

UPDATE:

Я отключил "runAllManagedModulesForAllRequests":

<modules runAllManagedModulesForAllRequests="false">
      <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>

И все работает нормально, но я нашел эту статью: http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html, которая рекомендует удалять и читать "UrlRoutingModule-4.0" модуль с пустым предварительным условием.

Я моя машина, добавление этого модуля находится в корневой web.config, и у него уже есть пустое preCondition:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>

Итак, теперь я немного смущен, каков статус этого параметра? Должен ли я использовать его или не должен? почему он по умолчанию считается истинным?

С уважением.

Ответ 1

Я моя машина, добавление этого модуля находится в корневой web.config, и у него уже есть пустое preCondition

Perfect. Это означает, что этот модуль всегда будет запускаться, что требуется для MVC, поскольку он использует ссылки без расширения.

Итак, теперь я немного смущен, каков статус этого параметра? Должен ли я использовать его или не должен? почему он по умолчанию считается истинным?

Поскольку поддержка расширения без продолжения является новой в IIS7 SP1 и IIS7.5 SP1. Он доступен для IIS7 как патч, который вы должны запросить и установить. Вы найдете его здесь с полными ответами на свои вопросы: http://support.microsoft.com/kb/980368

Почему этот параметр доходит до истины по умолчанию? Поскольку VS2010 был отправлен до IIS7 SP1. Может быть, это ложно в новых проектах MVC в VS2010SP1?

Ответ 2

Отвечая на ваш первый вопрос о том, что IIS должен обходить ASP.NET для статического контента.

Если сконфигурировано в интегрированном режиме, IIS 7.5 позволит управляемым модулям регистрироваться для событий, связанных с запросами, которые традиционно не обрабатываются ASP.NET, например статические файлы.

Это не происходит в классическом режиме IIS 7.5, который похож на IIS 6 и не позволяет управляемому модулю прослушивать события в запросах, которые не обрабатываются ASP.NET.

Итак, в основном, если у вас есть runAllManagedModulesForAllRequests="true" со встроенным режимом, то ваш управляемый модуль будет уведомлен о событиях для каждого запроса. Кроме того, из документации по runAllManagedModulesForAllRequests:

Истинно, если все управляемые модули могут обрабатывать все запросы, даже если запрос не предназначен для управляемого контента; в противном случае - false.

Значение по умолчанию - false.

Документация не объясняет, как этот атрибут взаимодействует с опцией preCondition. Из того, что вы испытали, кажется, что он переопределяет конфигурацию preCondition, поэтому я, если бы вы, я оставил бы ее в false и просто работал с параметрами preCondition, даже если это означает изменение других условий preconditions на пустую строку для обхода изменение runAllManagedModulesForAllRequests на false.


Обновление: Найденную документацию о последствиях использования runAllManagedModulesForAllRequests и, как уже говорилось, если true, является переопределением для preCondition с опцией managedHandler.

Вы также можете использовать ярлык для включения всех управляемых (ASP.NET) модулей в для всех запросов в вашем приложении, независимо от "managedHandler" - предварительное условие. Чтобы все управляемые модули запускались для всех запросов без настройки каждой записи модуля для удаления Предварительное условие "managedHandler" , используйте свойство runAllManagedModulesForAllRequests в разделе:     

Когда вы используете это свойство, предварительное условие "managedHandler" не имеет эффект и все управляемые модули запускаются для всех запросов.

Ответ 4

Я полагаю, если вы действительно хотите игнорировать, вы не должны использовать кривые скобки:

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

Ответ 5

Попробуйте проигнорировать список всех статических файлов

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });