有人使用ASP.NET进行过HTTP压缩吗?
我在这方面花了不少时间,但似乎什么也没做。我有一个很大的页面,我真的想加快速度。显然,应该从HTTP压缩开始,但我似乎无法让它为我工作 经过大量搜索,我尝试了下面代码的几种变体。它可以正常工作,但在刷新浏览器后,结果似乎会崩溃。当页面使用缓存时,他们变成了垃圾。如果我关闭缓存,那么页面看起来是正确的,但我丢失了CSS格式(存储在单独的文件中),并得到一个错误,即包含的JS文件包含无效字符 我在网上找到的大多数资源要么非常陈旧,要么主要用于直接访问IIS。我的页面运行在共享主机帐户上,我没有直接访问IIS7的权限,而IIS7正在运行有人使用ASP.NET进行过HTTP压缩吗?,asp.net,http,compression,gzip,Asp.net,Http,Compression,Gzip,我在这方面花了不少时间,但似乎什么也没做。我有一个很大的页面,我真的想加快速度。显然,应该从HTTP压缩开始,但我似乎无法让它为我工作 经过大量搜索,我尝试了下面代码的几种变体。它可以正常工作,但在刷新浏览器后,结果似乎会崩溃。当页面使用缓存时,他们变成了垃圾。如果我关闭缓存,那么页面看起来是正确的,但我丢失了CSS格式(存储在单独的文件中),并得到一个错误,即包含的JS文件包含无效字符 我在网上找到的大多数资源要么非常陈旧,要么主要用于直接访问IIS。我的页面运行在共享主机帐户上,我没有直接访
protected void Application_BeginRequest(object sender, EventArgs e)
{
// Implement HTTP compression
if (Request["HTTP_X_MICROSOFTAJAX"] == null) // Avoid compressing AJAX calls
{
// Retrieve accepted encodings
string encodings = Request.Headers.Get("Accept-Encoding");
if (encodings != null)
{
// Verify support for or gzip (deflate takes preference)
encodings = encodings.ToLower();
if (encodings.Contains("gzip") || encodings == "*")
{
Response.Filter = new GZipStream(Response.Filter,
CompressionMode.Compress);
Response.AppendHeader("Content-Encoding", "gzip");
Response.Cache.VaryByHeaders["Accept-encoding"] = true;
}
else if (encodings.Contains("deflate"))
{
Response.Filter = new DeflateStream(Response.Filter,
CompressionMode.Compress);
Response.AppendHeader("Content-Encoding", "deflate");
Response.Cache.VaryByHeaders["Accept-encoding"] = true;
}
}
}
}
有谁在这方面取得了更好的成功吗?我使用
GZipStream
和deflatesttream
直接编写输出,但我不熟悉Response.Filter
属性。试一试:
string response = "your output body";
string accept = Request.Headers["Accept-Encoding"];
if(accept == null) accept = "";
if (response.Length < 100 || !(accept.Contains("deflate") || accept.Contains("gzip")))
Response.Write(response);
else
{
byte[] compressed;
bool useDeflate = accept.Contains("deflate");
using (MemoryStream stream = new MemoryStream())
{
using (Stream deflate = useDeflate
? (Stream)new DeflateStream(stream, CompressionMode.Compress, true)
: (Stream)new GZipStream(stream, CompressionMode.Compress, true))
using (StreamWriter writer = new StreamWriter(deflate))
writer.Write(response);
compressed = new byte[stream.Length];
stream.Position = 0;
stream.Read(compressed, 0, compressed.Length);
}
Response.Headers["Content-Encoding"] = useDeflate ? "deflate" : "gzip";
Response.BinaryWrite(compressed);
}
string response=“您的输出主体”;
字符串accept=Request.Headers[“accept Encoding”];
如果(accept==null)accept=“”;
if(response.Length<100 | | |!(accept.Contains(“deflate”)| | accept.Contains(“gzip”))
响应。写入(响应);
其他的
{
字节[]压缩;
bool useDeflate=accept.Contains(“deflate”);
使用(MemoryStream stream=new MemoryStream())
{
使用(流放气=使用放气
?(流)新的deflatestStream(流,压缩模式。压缩,真)
:(Stream)新的gzip流(Stream,CompressionMode.Compress,true))
使用(StreamWriter=新StreamWriter(deflate))
写作(回应);
压缩=新字节[stream.Length];
流位置=0;
stream.Read(压缩、0、压缩、长度);
}
Response.Headers[“Content Encoding”]=useDeflate?“deflate”:“gzip”;
二进制写入(压缩);
}
应用程序_BeginRequest()中是否也有此功能?遗憾的是,我只参与过一个ASP.Net项目,一直以来都是.ashx IHttpHandler,它允许您将整个响应正文视为字符串(如果您愿意)。我真的不知道它是如何在常规的.aspx页面中完成的。我研究过的所有其他C#都是Win32之类的东西。如果ASP.Net具有某种输出缓冲机制,则此代码将在刷新之前对其进行处理。。。不管在哪里。对不起,我不能说得更具体了!