Может ли страница отказаться от сжатия IIS 7?

Мои страницы автоматически сжимаются 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" />

Другие варианты?

Существуют ли другие варианты отказа от сжатия?


person Glen Little    schedule 20.04.2010    source источник


Ответы (6)


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

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

Чтобы отключить статическое сжатие только для одного каталога, сначала включите глобальное статическое сжатие (если оно отключено), а затем отключите статическое сжатие для этого каталога. Например, чтобы включить статическое сжатие для каталога по адресу 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

person Nicolas    schedule 21.04.2010

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

person MK.    schedule 23.04.2010
comment
Это самый многообещающий подход, который я видел до сих пор. Спасибо! - person Glen Little; 24.04.2010

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

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

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

person asgerhallas    schedule 25.04.2010

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

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

person Miguel Ventura    schedule 20.04.2010

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

person Laurence    schedule 19.11.2011

Если вам нужно решение, которое зависит только от 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;
            }
        }
    }
}
person Alexander    schedule 23.08.2012