Windows Azure Web角色上的JSON数据的HTTP压缩

时间:2011-02-17 16:40:04

标签: json compression azure

我已经为我的Azure Web角色正确配置了压缩。 .aspx页面和* .css等静态页面都被正确压缩。

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

我有几个不同的[System.Web.Services.WebMethod],但是没有返回GZIP的数据。每个请求的大小大约是350KB,所以我认为如果能让它工作起来应该会快得多。

在我的webMethod中,我创建一个对象列表,返回对象,并假设某种类型的内置序列化器将其转换为JSON?

是否有强迫此内容被压缩? 非常感谢!

2 个答案:

答案 0 :(得分:0)

我看到人们因内置多种原因而遇到内置压缩问题

最简单的方法是使用第三方组件(如Telerik的RadCompression)对AJAX调用的响应强制执行压缩。

或者,您可以覆盖应用程序的BeginRequest方法或编写自己的处理程序  即时收拾回复。如何执行此操作的基本VB版本在此处:

Sub Application_BeginRequest(...)

如果Request.RawUrl.Contains(“。aspx”)和_ 不是Request.Headers(“接受编码”)是什么然后

如果Request.Headers(“接受 - 编码“)。ToLower()。包含(”gzip“)然后

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

'否则......如果不允许GZip,则尝试放气

结束如果

结束如果

End Sub

我已经使用处理程序完成了一个方法(这就是我相信Telerik的RadCompression使用的方法),但是由于你必须修改响应大小等,它会变得更复杂。

答案 1 :(得分:0)

这就是我最终得到的结果,是Yak的回答。

        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");
                    }
                }
            }
        }