【问题标题】: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");
}
}
}
}