【问题标题】:HTTP Compression of JSON Data on Windows Azure Web RoleWindows Azure Web 角色上 JSON 数据的 HTTP 压缩
【发布时间】:2011-02-17 16:40:04
【问题描述】:

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

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

不过,我有几个不同的 [System.Web.Services.WebMethod],它们不返回 GZIP 数据。每个请求的大小约为 350KB,所以我认为如果我可以让它工作,它应该会快一些。

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

是否有强制压缩此内容的方法? 非常感谢!

【问题讨论】:

标签: json compression azure


【解决方案1】:

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

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

或者,您可以覆盖应用程序的 BeginRequest 方法或编写自己的处理程序 即时打包回复。如何做到这一点的基本 VB 版本在这里:

子应用程序_BeginRequest(...)

如果 Request.RawUrl.Contains(".aspx") 和 _ 不是 Request.Headers("Accept-Encoding") 那么什么都不是

如果 Request.Headers("接受- encoding").ToLower().Contains("gzip") 然后

Response.Filter = New GZipStream(Response.Filter,CompressionMode.Compress, True) Response.AppendHeader("内容编码", "gzip")

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

如果结束

如果结束

结束子

我也使用处理程序完成了一个方法(这就是我相信 Telerik 的 RadCompression 使用的方法),但它有点复杂,因为您必须修改响应大小等。

【讨论】:

    【解决方案2】:

    这是我最终得到的结果,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");
                        }
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      相关资源
      最近更新 更多