IIS понимает статические файлы в MVC как динамический контент - PullRequest
6 голосов
/ 05 декабря 2011

Играя с 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 и происходит то же самое.

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

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

Приветствие.

Ответы [ 4 ]

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

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

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

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

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

0 голосов
/ 27 марта 2012

Это должно помочь (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>
0 голосов
/ 11 декабря 2011
<modules runAllManagedModulesForAllRequests="true" />

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

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

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

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

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

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

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

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

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

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

...