Может ли страница отказаться от сжатия IIS 7? - PullRequest
13 голосов
/ 20 апреля 2010

Мои страницы автоматически сжимаются IIS7 с помощью GZIP.

Это замечательно ... но для одной конкретной страницы мне нужно передать ее пользователю, используя Response.Flush() при необходимости.Но когда выходные данные сжимаются, сервер IIS, кажется, собирает все мои выходные данные до тех пор, пока страница не будет завершена перед сжатием и отправкой ее клиенту.Это сводит на нет мою попытку очистить содержимое от пользователя.

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

Один из возможных вариантов

Я определил, что если я вручную установлю тип контента, который не соответствует конфигурации IIS на c:\windows\system32\inetsrv\config\applicationhost.config, то IIS не будет сжимать его.Например.Response.ContentType = "x-text/html".Это нормально работает с IE8, так как он отображает HTML.Но Firefox спросит пользователя, что делать с неизвестным типом файла.

Это может сработать, если бы существовал другой тип Mime, который я мог бы использовать, чтобы браузеры принимали как HTML, что не соответствует applicationhost.config,Для справки, это MIME-типы, которые будут сжаты:

   <add mimeType="text/*" enabled="true" />
   <add mimeType="message/*" enabled="true" />
   <add mimeType="application/x-javascript" enabled="true" />
   <add mimeType="application/atom+xml" enabled="true" />
   <add mimeType="application/xaml+xml" enabled="true" />

Другие опции?

Есть ли другие варианты отказаться от сжатия?

Ответы [ 6 ]

3 голосов
/ 21 апреля 2010

Может быть невозможно отключить сжатие для определенной страницы, но вы можете сделать это для каталога.

Здесь описывается, как отключить статическое сжатие, но оно может работать для динамического сжатия: (с http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true)

Чтобы отключить статическое сжатие только для одного каталога, сначала включите глобальное статическое сжатие (если оно отключено), а затем отключите статическое сжатие в этом каталоге. Например, чтобы включить статическое сжатие для каталога в http://www.contoso.com/Home/StyleSheets,, выполните следующие действия:

  1. Включите глобальное статическое сжатие, выполнив в командной строке следующую команду:

adsutil set w3svc/filters/compression/parameters/HcDoStaticCompression true

  1. Отключите статическое сжатие в этом каталоге, выполнив в командной строке следующую команду:

adsutil set w3svc/1/root/Home/StyleSheets/DoStaticCompression false

1 голос
/ 25 апреля 2010

Вы можете использовать специальный модуль сжатия, например, такой:

HTTP-сжатие WebResource.axd и страниц в ASP.NET

Используя это, должно быть легко настроить, какие файлы включать / исключать.

1 голос
/ 23 апреля 2010

Не уверен, что мне это нравится, но, возможно, стоит упомянуть: Отключить сжатие GZIP для клиентов IE6

0 голосов
/ 23 августа 2012

Если вам нужно решение, которое зависит только от C #, вы можете адаптировать этот метод, который я написал, чтобы справиться с проблемой в браузере Android:

/// <summary>
/// Alters the current HTTP request only for Android user agents, in order to disable web page compression so the Android browser will not cut off most of the page content, based on the Content-length HTTP header. 
/// </summary>
public static void fixAndroidPageDisplay()
{
    HttpContext c = HttpContext.Current;
    if (c == null) return;
    HttpRequest r = c.Request;
    if (r == null || r.UserAgent == null) return;
    if (r.UserAgent.ToLowerInvariant().Contains("android"))
    {
        HttpResponse rsp = c.Response;

        if (rsp != null)
        {
            string ce = null;
            foreach (string s in rsp.Headers.Keys)
            {
                if (s != null)
                {
                    if (s.ToLowerInvariant().Equals("content-encoding")) {
                        ce = s;
                    }
                }
            }
            if (ce != null) {
                rsp.Headers[ce] = "text/html";
                rsp.Filter = rsp.OutputStream;
            }
        }
    }
}
0 голосов
/ 19 ноября 2011

если вы сделаете Response.BufferOutput = false, это остановит работу встроенного сжатия, хотя и не совсем. Вы можете получить предупреждение о том, что заголовки не могут быть добавлены после того, как они уже отправлены клиенту.

0 голосов
/ 21 апреля 2010

Я не знаю, каким образом страница может отключить себя программно во время запроса. Однако вы можете обойти сжатие и отправить дополнительный мусор, достаточный для того, чтобы gzip обработал новый блок. Ваши данные заполнения должны быть настолько случайными, насколько это возможно, чтобы они не были слишком сжаты, заполняя буфер дефляции быстрее.

Фактический объем данных для отправки зависит от конфигурации модуля сжатия.

...