如何在Asp .Net 3.5 Web应用程序中使用gzip压缩来压缩JavaScript和CSS? Gzip压缩在CSS菜单和验证器脚本中导致错误。
答案 0 :(得分:0)
将以下代码添加到Global.asax并将其放入根目录。
<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<script runat="server">
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
Stream prevUncompressedStream = app.Response.Filter;
if (!(app.Context.CurrentHandler is Page ||
app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;
if (acceptEncoding == null || acceptEncoding.Length == 0)
return;
acceptEncoding = acceptEncoding.ToLower();
if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
{
// defalte
app.Response.Filter = new DeflateStream(prevUncompressedStream,
CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
} else if (acceptEncoding.Contains("gzip"))
{
// gzip
app.Response.Filter = new GZipStream(prevUncompressedStream,
CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
}
</script>
答案 1 :(得分:0)
为什么不使用HttpCompression?这将使您能够压缩所有静态内容,包括javascript和CSS文件。
答案 2 :(得分:0)
(我已经使用这种技术已经有一段时间了 - 因此是vb.net代码!)
尽管IIS 6.0不支持压缩,但大多数浏览器都支持基本的gzip压缩,并且它们通过在每个请求中发送标头来通知服务器此功能。下面的代码显示了如何使用System.IO.Compression命名空间向输出流添加过滤器,该输出流在检查和设置正确的标头时压缩输出。
context.Response.Clear()
context.Response.Buffer = True
context.Response.AddHeader("content-disposition", String.Format( "attachment;filename={0}", fileName))
context.Response.ContentEncoding = Encoding.UTF8
context.Response.Cache.SetCacheability(HttpCacheability.Private)
'Compress the output as it may be very large
'When flushing or closing+ending the stream, the compression filter does not have a chance to write the compression footer
'Therefore, make sure the compression filter stream is closed before flushing
AddCompression(context)
context.Response.ContentType = "application/vnd.ms-excel" 'This example was an excel doc
'Write to response
context.Response.Write(your-data-here)
'context.Response.Flush() 'Do not flush if using compression
'context.Response.Close()
context.Response.End()
AddCompression方法检查相应的标头,并将压缩过滤器流添加到输出:
'Add compression to the response stream
Public Sub AddCompression(ByVal context As HttpContext)
Dim acceptEncoding As String = context.Request.Headers("Accept-Encoding")
If acceptEncoding Is Nothing OrElse acceptEncoding.Length = 0 Then Return
'Convert to lower to check
acceptEncoding = acceptEncoding.ToLower
'Gzip or Compress compression
'Compress compression is quicker and performs better compression so try that first
If (acceptEncoding.Contains("deflate")) Then
context.Response.Filter = New DeflateStream(context.Response.Filter, CompressionMode.Compress)
context.Response.AppendHeader("Content-Encoding", "deflate")
ElseIf acceptEncoding.Contains("gzip") Then
context.Response.Filter = New GZipStream(context.Response.Filter, CompressionMode.Compress)
context.Response.AppendHeader("Content-Encoding", "gzip")
End If
End Sub
答案 3 :(得分:-1)
下载gzip压缩示例代码并将其添加到Global.asax文件中。