Сжать ответ не имеет никакого эффекта - PullRequest
5 голосов
/ 26 июня 2019

Я хочу отправить ответ на мой Asp.Net веб-сайт. и я написал этот код:

public static void CompressPage(HttpRequest Request, HttpResponse Response)
{
    string acceptEncoding = Request.Headers["Accept-Encoding"];
    Stream prevUncompressedStream = Response.Filter;

    if (acceptEncoding.IsEmpty())
    {
        return;
    }

    acceptEncoding = acceptEncoding.ToLower();

    if (acceptEncoding.Contains("gzip"))
    {
        Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress);
        Response.AppendHeader("Content-Encoding", "gzip");
    }
    else if (acceptEncoding.Contains("deflate"))
    {
        Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress);
            Response.AppendHeader("Content-Encoding", "deflate");
    }
}

и назовите это Page_Load событие:

protected void Page_Load(object sender, EventArgs e)
{
    ...
    ZipHtmlPage.CompressPage(Request, Response);
}

Проблема в том, что когда я запускаю код с кодом выше и без него в Page_Load, размер ответа не меняется.

enter image description here

Где проблема?

Спасибо


Редактировать 1)

Я думаю, что "Content-Encoding", "gzip" не добавляет в заголовок:

enter image description here

Не знаю почему?


Редактировать 2)

Когда я использую HttpModule для выполнения http сжатия:

public class CompressModule : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }

    private void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpContext context = HttpContext.Current;
        context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
        HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip"); 
    }
    public void Dispose()
    {
    }
}

Я получил это на каждой странице:

enter image description here

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Я думаю, это нестандартно, как вы добавляете сжатие. В прошлом я настраивал GZip в файле запуска. Еще я заметил, что сжатие не вступило в силу в режиме отладки. Попробуйте развернуть или запустить приложение в режиме выпуска , чтобы проверить, сжимает ли оно ответ.

В моем методе настройки служб у меня есть это:

services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Optimal;
});
1 голос
/ 30 июня 2019

добавляете ли вы эти коды в файл web.config (для файлов css и javascript):

<system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" />
      <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </dynamicTypes>
      <staticTypes>
        <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" />
        <add mimeType="*/*" enabled="false" />
      </staticTypes>
    </httpCompression>
...

может быть, эта ссылка поможет вам Как реализовать сжатие GZip в ASP.NET?

0 голосов
/ 30 июня 2019

Это неправильный способ сжатия страниц, например, во-первых, вам нужно проверить, принимает ли браузер gzip или deflate, а затем начать его сжатие, поэтому вы видите проводные символы.

private void Application_BeginRequest(Object source, EventArgs e)
{
    // wrong and dangerous
    HttpContext context = HttpContext.Current;
    context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
    HttpContext.Current.Response.AppendHeader("Content-Encoding", "gzip"); 
}

Лучший способ:

void context_BeginRequest(object sender, EventArgs e)
{
    var app = (HttpApplication)sender;
    var encodings = app.Request.Headers.Get("Accept-Encoding");


    if (encodings == null)
        return;

    var baseStream = app.Response.Filter;


    // check if browser accepts gzip or deflate
    if (encodings.ToLower().Contains("gzip"))
    {
        app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "gzip");
        app.Context.Trace.Warn("GZIP compression on");
    }
    else if (encodings.ToLower().Contains("deflate"))
    {
        app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "deflate");
        app.Context.Trace.Warn("Deflate compression on");
    }
}

Я рекомендую использовать библиотеку с именем HttpCompress, вы можете получить к ней доступ здесь . И снова, как говорили другие люди, почему бы вам не использовать встроенный модуль сжатия IIS?

...