Запросы на статические файлы попадают в управляемый код в ASP.NET MVC3 - PullRequest
10 голосов
/ 05 декабря 2011

Создавая собственные модули 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 обрабатывает этот запрос, верно?

С уважением.

ОБНОВЛЕНИЕ:

Я отключил «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, и у него уже есть пустое предварительное условие:

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>

Так что теперь я немного запутался, что это застатус этого параметра?Я должен использовать это или не должен?почему по умолчанию оно считается "true"?

С уважением.

Ответы [ 5 ]

9 голосов
/ 07 декабря 2011

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

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

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

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

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

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

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


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

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

При использовании этого свойства предварительное условие «managedHandler» не имеетэффект и все управляемые модули работают для всех запросов.

6 голосов
/ 11 декабря 2011

На моем компьютере этот модуль добавлен в корневой каталог web.config, и в нем уже пустое предварительное условие

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

Так что теперь я немного запутался, каково состояние этого параметра? Я должен использовать это или не должен? почему по умолчанию оно считается "true"?

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

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

2 голосов
/ 09 декабря 2011

Вы можете написать следующий код для него.

routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });

Дополнительную информацию можно найти по ссылке ниже

http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

1 голос
/ 05 декабря 2011

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

routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");
0 голосов
/ 15 июля 2015

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

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