Странные эффекты в файлах .css после активации сжатия - PullRequest
2 голосов
/ 19 октября 2011

Вчера я активировал сжатие на своем сайте, например:

void context_BeginRequest(object sender, EventArgs e)
{

    HttpApplication app = (HttpApplication)sender;
    string encodings = app.Request.Headers.Get("Accept-Encoding");

    if (encodings == null)
        return;

    string url = app.Request.RawUrl.ToLower();           


    if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx"))
    {

        Stream baseStream = app.Response.Filter;
        encodings = encodings.ToLower();

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

Прошлой ночью люди жаловались на то, что стили сайта были сломаны. Я пробовал сайт в Firefox и Chrome и получал ту же проблему, пока не сделал принудительное обновление, очистив кеш.

Этим утром я открыл Safari, чтобы посмотреть, как он выглядит в этом браузере, и проверил сохраненные таблицы стилей. Вот раздел верхней строки:

���`I�%&/m�{J�J��t��`$ؐ@�������iG#)�*��eVe]f@�흼��{����{����;�N'���?\fdl��J�ɞ!���?~|?"�~+M�m�?��{�7y����l]�餮���N���̛�x�Ϋ�Q�cMVg��

Я думаю, что либо Safari пытался распаковать что-то, что не было сжато с самого начала, либо он получил сжатый файл и не декодировал его.

Это разовая проблема, которая будет устранена, как только посетители моего сайта очистят свой кэш, или я допустил ошибку при написании своей функции HttpCompression?

Ответы [ 2 ]

1 голос
/ 19 октября 2011

попробуйте вместо этого:

   HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (!(app.Context.CurrentHandler is Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (string.IsNullOrEmpty(acceptEncoding))
            return;

        acceptEncoding = acceptEncoding.ToLower();


        if (acceptEncoding.Contains("gzip") || acceptEncoding == "*")
        {
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
        else if (acceptEncoding.Contains("deflate"))
        {
            // defalte
            app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
0 голосов
/ 21 октября 2011

Я считаю, что моя проблема была связана с отсутствием заголовка Vary:Accept-Encoding, добавляемого в мои ответы. Пожалуйста, смотрите этот связанный вопрос по теме . Мой код теперь выглядит так:

if (url.Contains(".js") || url.Contains(".aspx") || url.Contains(".css") || url.Contains("ajax.ashx"))
{
    app.Response.AppendHeader("Vary", "Accept-Encoding");

    encodings = encodings.ToLower();

    if (encodings.Contains("gzip") || encodings == "*")
    {
        app.Response.Filter = new GZipStream(baseStream, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "gzip");

    }
    else if (encodings.Contains("deflate"))
    {
        app.Response.Filter = new DeflateStream(baseStream, CompressionMode.Compress);
        app.Response.AppendHeader("Content-Encoding", "deflate");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...