Запросы на статические файлы попадают в управляемый код в 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" не имеет эффект и все управляемые модули запускаются для всех запросов.
Ответ 3
Вы можете написать для него следующий код.
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
Ответ 4
Я полагаю, если вы действительно хотите игнорировать, вы не должны использовать кривые скобки:
routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");
Ответ 5
Попробуйте проигнорировать список всех статических файлов
routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });