谈mvc开发中gzip压缩的应用
压缩view的内容,可加过滤器
public class GzipFilter : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
if (String.IsNullOrEmpty(acceptEncoding)) return;
var response = filterContext.HttpContext.Response;
acceptEncoding = acceptEncoding.ToUpperInvariant();
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-Encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-Encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}
然后在要压缩的页面控制器上加标签。
[GzipFilter]
public ActionResult Index()
现在基本上所有的浏览器支持gzip, deflate.
这里是编程对css和js文件进行压缩放在本地,然后发送给客户端。
----这种方法在iis7.5的集成模式下有效,在vs中有效,但在iis6里我还没配置好,无效
----关键是请求,只对action有效,像js,css文件的请求,在BeginRequest里检测不到。这种方法运行在iis7里很完美,文件大概会被压缩到原来的1/3到1/4.
此方法主要是给请求的文件加上http头//Response.AppendHeader("Content-Encoding", "gzip"); 这里很难处理。
如果有谁找到iis6里面可以运行的方法麻烦告诉我,或许能一起讨论找到更好的解决方案,非常感谢!
---pukuimin@qq.com
浏览器检测到这个头,就会对文件进行解压缩,就正常运行了。
protected void Application_BeginRequest(object sender, EventArgs e)
{
GzipFiles();
}
private void GzipFiles()
{
string acceptEncoding = Request.Headers["Accept-Encoding"];
string filepath = Request.FilePath;
string mapfilepath = Server.MapPath("~" + filepath);
if (acceptEncoding.Contains("gzip"))
{
#region Gzip处理
if (filepath.EndsWith(".css"))//css文件处理
{
Response.AppendHeader("Content-Type", "text/css");
Request.ContentType = "text/css";
if (filepath.EndsWith("gzip.css"))
{
FileInfo fi = new FileInfo(mapfilepath);
Response.AppendHeader("Content-Encoding", "gzip");
int len = mapfilepath.Length - "gzip.css".Length;
if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
}
}
else if (filepath.EndsWith(".js"))//js文件处理
{
Response.AppendHeader("Content-Type", "application/x-javascript");
Request.ContentType = "application/x-javascript";
if (filepath.EndsWith("gzip.js"))
{
FileInfo fi = new FileInfo(mapfilepath);
Response.AppendHeader("Content-Encoding", "gzip");
int len = mapfilepath.Length - "gzip.js".Length;
if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
}
}
#endregion
}
else if (acceptEncoding.Contains("deflate"))
{
#region deflate处理
if (filepath.EndsWith(".css"))//css文件处理
{
Response.AppendHeader("Content-Type", "text/css");
Request.ContentType = "text/css";
if (filepath.EndsWith("deflate.css"))
{
FileInfo fi = new FileInfo(mapfilepath);
Response.AppendHeader("Content-Encoding", "gzip");
int len = mapfilepath.Length - "deflate.css".Length;
if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
}
}
else if (filepath.EndsWith(".js"))//js文件处理
{
Response.AppendHeader("Content-Type", "application/x-javascript");
Request.ContentType = "application/x-javascript";
if (filepath.EndsWith("deflate.js"))
{
FileInfo fi = new FileInfo(mapfilepath);
Response.AppendHeader("Content-Encoding", "gzip");
int len = mapfilepath.Length - "deflate.js".Length;
if (fi.Exists == false) GZip(mapfilepath.Substring(0, len), mapfilepath);
}
}
#endregion
}
}
public void GZip(string fileName, string gipFileName)
{
FileStream fr = File.Create(gipFileName);
FileStream fc = File.OpenRead(fileName);
GZipStream gzs = new GZipStream(fr, CompressionMode.Compress); //压缩文件类
byte[] arr = new byte[fc.Length];
fc.Read(arr, 0, (int)fc.Length);
gzs.Write(arr, 0, (int)fc.Length);
gzs.Close();
fc.Close();
fr.Close();
}
//解压缩文件方法
public void DeZGip(string fileName, string gipFileName)
{
//准备输入输出文件
FileStream fc = File.Create(fileName);
FileStream fr = File.OpenRead(gipFileName);
GZipStream gzs = new GZipStream(fr, CompressionMode.Decompress);
byte[] arr = new byte[fr.Length];
fr.Read(arr, 0, (int)fr.Length);
fc.Write(arr, 0, (int)fr.Length);
gzs.Close();
fr.Close();
fc.Close();
}