HTTP-сжатие данных JSON в веб-роли Windows Azure - PullRequest
0 голосов
/ 17 февраля 2011

У меня настроено сжатие для моей веб-роли Azure.Страницы .aspx и статические страницы типа * .css сжимаются правильно.

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" />

У меня есть несколько разных [System.Web.Services.WebMethod], которые не возвращают GZIPд данные.Размер каждого запроса составляет около 350 КБ, поэтому я думаю, что это должно быть немного быстрее, если я смогу заставить это работать.

В моем webMethod я создаю список объектов, возвращаю объекты,и я предполагаю, что какой-то встроенный сериализатор превращает это в JSON?

Есть ли способ заставить этот контент быть сжатым?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 18 марта 2011

Вот что я закончил, вариант ответа Яка.

        HttpApplication app = (HttpApplication)sender;
        HttpRequest request = app.Request;
        HttpResponse response = app.Response;

        System.Web.HttpApplication Appl = (System.Web.HttpApplication)sender;
        HttpContext context = Appl.Context;
        string origpath = context.Request.Url.AbsolutePath;


        //Ajax Web Service request is always starts with application/json
        if (request.ContentType.ToLower(CultureInfo.InvariantCulture).StartsWith("application/json"))
        {
            //User may be using an older version of IE which does not support compression, so skip those
            if (!((request.Browser.IsBrowser("IE")) && (request.Browser.MajorVersion <= 6)))
            {
                string acceptEncoding = request.Headers["Accept-Encoding"];

                if (!string.IsNullOrEmpty(acceptEncoding))
                {
                    acceptEncoding = acceptEncoding.ToLower(CultureInfo.InvariantCulture);

                    if (acceptEncoding.Contains("gzip"))
                    {
                        response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                        response.AddHeader("Content-encoding", "gzip");
                    }
                    else if (acceptEncoding.Contains("deflate"))
                    {
                        response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                        response.AddHeader("Content-encoding", "deflate");
                    }
                }
            }
        }
0 голосов
/ 18 февраля 2011

Я видел, что у людей возникают проблемы со встроенным сжатием по многим причинам

Самый простой способ - использовать сторонний компонент, такой как RadCompression Telerik, для принудительного сжатия ответа на вызовы AJAX.

Кроме того, вы можете переопределить метод приложения BeginRequest или написать свой собственный обработчик для упаковки ответов на лету.Базовая версия VB о том, как это сделать, находится здесь:

Sub Application_BeginRequest (...)

If Request.RawUrl.Contains (". Aspx") и _ Not Request.Headers ("Accept-Encoding") - ничто, тогда

Если Request.Headers ("Accept-encoding"). ToLower (). Contains ("gzip") Then

Response.Filter = New GZipStream(Response.Filter, CompressionMode.Compress, True) Response.AppendHeader ("Content-encoding", "gzip")

'Еще ... попытка дефляции, если GZip не разрешен

КонецЕсли

Конец Если

Конец Sub

Я также выполнил метод с обработчиком (и это то, что я думаю, использует RadCompression Telerik), но это хорошийнемного сложнее, так как вам нужно изменить размер ответа и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...