IIS понимает статические файлы в MVC как динамический контент

Играя с httpCompression, я понял, что IIS воспринимает статические файлы в MVC как динамическое содержимое, поэтому, даже если вы отметите «Включить сжатие статического содержимого», но не установите флажок «Включить сжатие динамического содержимого ", IIS вернет файлы .css и .js без сжатия:

GET /MVCX/Content/Site.css HTTP/1.1
Host: localhost
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: text/css,*/*;
Referer: http://localhost/mvcx/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

HTTP/1.1 200 OK
Content-Type: text/css
Last-Modified: Mon, 05 Dec 2011 12:42:37 GMT
Accept-Ranges: bytes
ETag: "c79895e4bb3cc1:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 05 Dec 2011 12:44:43 GMT
Content-Length: 1005

Но затем, если я отмечу «Включить сжатие динамического содержимого», файлы будут сжаты:

GET /MVCX/Content/Site.css HTTP/1.1
Host: localhost
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: text/css,*/*;
Referer: http://localhost/mvcx/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

HTTP/1.1 200 OK
Content-Type: text/css
Content-Encoding: gzip
Last-Modified: Mon, 05 Dec 2011 12:42:37 GMT
Accept-Ranges: bytes
ETag: "c79895e4bb3cc1:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 05 Dec 2011 12:48:36 GMT
Content-Length: 522

Даже если я пытаюсь игнорировать маршруты к ~/Content и ~/Scripts, эти файлы все равно воспринимаются как динамический контент:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{Content}/{*pathInfo}");
        routes.IgnoreRoute("{Scripts}/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

Я думаю, это, вероятно, связано с тем, что строка web.config, необходимая для MVC, также заставляет весь запрос проходить через конвейер ASP.NET:

<modules runAllManagedModulesForAllRequests="true" />

ОБНОВЛЕНИЕ: я попытался установить для этого параметра значение false, и происходит то же самое.

Есть ли способ избежать этого? Мне не нужно сжатие для моего динамического контента, но я хочу его для своего статического контента.

Или единственный способ положить файлы куда-то еще?

Ваше здоровье.


person vtortola    schedule 05.12.2011    source источник
comment
мой ответ (и пост Рика Страла) вам вообще поможет? Любопытно, вы когда-нибудь проходили мимо этого куска.   -  person one.beat.consumer    schedule 31.12.2011


Ответы (4)


Я думаю, вы обнаружите, что Рик уже ответил на ваш вопрос здесь:

http://www.west-wind.com/weblog/posts/2011/May/05/Builtin-GZipDeflate-Compression-on-IIS-7x

Я не уверен, почему у вас есть эта проблема, если честно. Статическое сжатие у меня работает из коробки в MVC3, особых изменений не требуется.

Как сказал RickNZ, убедитесь, что типы mime правильно учитываются в applicationhost.config.

person one.beat.consumer    schedule 12.12.2011

Вы можете включить динамическое сжатие для каждой папки в диспетчере IIS. Сначала щелкните имя папки на панели «Подключения», затем дважды щелкните значок «Сжатие» в центральной панели и выберите «Включить динамическое сжатие».

Или, вот еще один, более грубый способ:

Отредактируйте C:\Windows\System32\inetsrv\config\applicationHost.config (файл конфигурации IIS; сначала сделайте копию).

В разделе httpCompression удалите строки с mimeType="/" и mimeType="text/*" и замените их на mimeType="text/css" (запись для JS уже есть) .

После перезапуска IIS динамическое сжатие должно применяться только к вашим файлам CSS и JS, а не к выходным данным aspx (текст/html).

person RickNZ    schedule 06.12.2011
comment
Я использую MVC, поэтому папок нет. Я попытался настроить его в основном файле Web.config, но это не сработало. - person vtortola; 07.12.2011
comment
По умолчанию я не думаю, что вы можете установить тег urlCompression в web.config; как параметр IIS, он находится в applicationHost.config. Вы должны иметь возможность редактировать конфигурацию, чтобы установить правильный путь. Вы пробовали изменить mimeType в applicationHost.config? - person RickNZ; 08.12.2011

<modules runAllManagedModulesForAllRequests="true" />

больше не требуется для IIS 7.5 SP1 или IIS7 SP1. Это было необходимо для MVC, поэтому запросы на URL-адрес без расширения проходят через конвейер asp.net.

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

В конфигурации IIS проверьте столбец «менеджер сопоставления», «путь». Возможно, у вас есть настройка сопоставления для этих файлов. Также проверьте * путь с помощью StaticFileHandler.

Вы удалили какой-либо обработчик в своем web.config? Может быть, добавив заявление?

person Softlion    schedule 10.12.2011

Это должно помочь (IIS7 MVC3):

Добавьте еще один маппер в свой web.config

<system.webServer>
    <modules runAllManagedModulesForAllRequests="false">
...
    </modules>

 <handlers>
      <remove name="UrlRoutingHandler" />     
      <clear />
      <add name="svc-ISAPI-4.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
      <add name="AssemblyResourceLoader-Integrated" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />
      <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" modules="ManagedPipelineHandler" resourceType="Unspecified" requireAccess="Read" preCondition="integratedMode" />
     <add name="StaticFileHandler-html" path="*.html" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read"/>
 ...     
      <add name="StaticFileHandler-css" path="*.css" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
      <add name="StaticFileHandler-js" path="*.js" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
      <add name="wildcard" path="*" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="integratedMode" responseBufferLimit="4194304" />
      <add name="PageHandlerFactory-Folders" path="*" verb="*" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" resourceType="Unspecified" requireAccess="Read" allowPathInfo="false" preCondition="integratedMode" />
      <add name="StaticFileHandler" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
    </handlers>
person Natalya    schedule 27.03.2012