2010-01-22 95 views
0

我使用了YSlow Firefox附加组件,它返回以下结果:使用gzip压缩组件的D级

--------------------- -------------------------------------------------- ------------------
d级上压缩部件用gzip

有应发送压缩

* http://localhost:63808/WebSite/BemVindo/ 
* http://localhost:63808/WebSite/css/Global.css?... 
* http://localhost:63808/WebSite/js/Global.js?... 

3个明文部件 - -------------------------------------------------- --------------------------------------
于是我开始寻找并得到了这一段代码:

的Global.asax

Private Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs) 

    Dim Response As HttpResponse = HttpContext.Current.Response 
    Dim AcceptEncoding As String = HttpContext.Current.Request.Headers("Accept-Encoding") 

    If Not String.IsNullOrEmpty(AcceptEncoding) AndAlso AcceptEncoding.Contains("gzip") OrElse AcceptEncoding.Contains("deflate") Then 
     If AcceptEncoding.Contains("deflate") Then 
      Response.Filter = New System.IO.Compression.DeflateStream(Response.Filter, System.IO.Compression.CompressionMode.Compress) 
      Response.AppendHeader("Content-Encoding", "deflate") 
     Else 
      Response.Filter = New System.IO.Compression.GZipStream(Response.Filter, System.IO.Compression.CompressionMode.Compress) 
      Response.AppendHeader("Content-Encoding", "gzip") 
     End If 
    End If 

    Response.AppendHeader("Vary", "Content-Encoding") 

End Sub 

现在我有:

上用gzip

精细压缩部件A级,哼?问题是:Application_PreRequestHandlerExecute事件是对请求进行gzip/deflate的最佳位置吗?

+0

我没有直接回答,因为我没有做IIS,所以我可能是错的“最佳实践”,但你通常* *配置此在这里描述的Web服务器级别http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/25d2170b-09c0-45fd-8da4-898cf9a7d568.mspx?mfr=true顺便说一下,当前标题“添加过期标题”相关的问题? :) – BalusC 2010-01-22 21:21:44

+0

但我没有控制IIS ......这段代码实际上起作用了,但我担心它是否会在请求开销之前! 呵呵,我改了标题,这是另外一个问题。 – Fernando 2010-01-22 21:40:29

回答

1

是的,Application_PreRequestHandlerExecute事件是对请求进行gzip/deflate的最佳位置。

2

不确定,但您的代码可能会导致使用Ajax的页面出现问题。下面的页面显示了类似的代码,但如果检测到Ajax,则取消压缩:Enabling Gzip and Deflate HTTP Compression in ASP.NET pages。我在VB中翻译了代码,但没有尝试过。

埃里克

Private Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs) 
Dim app As HttpApplication = TryCast(sender, HttpApplication) 
Dim acceptEncoding As String = app.Request.Headers("Accept-Encoding") 
Dim prevUncompressedStream As Stream = app.Response.Filter 

If Not (TypeOf app.Context.CurrentHandler Is Page OrElse app.Context.CurrentHandler.[GetType]().Name = "SyncSessionlessHandler") OrElse app.Request("HTTP_X_MICROSOFTAJAX") IsNot Nothing Then 
    Return 
End If 

If acceptEncoding Is Nothing OrElse acceptEncoding.Length = 0 Then 
    Return 
End If 

acceptEncoding = acceptEncoding.ToLower() 

If acceptEncoding.Contains("deflate") OrElse acceptEncoding = "*" Then 
    ' defalte 
    app.Response.Filter = New DeflateStream(prevUncompressedStream, CompressionMode.Compress) 
    app.Response.AppendHeader("Content-Encoding", "deflate") 
ElseIf acceptEncoding.Contains("gzip") Then 
    ' gzip 
    app.Response.Filter = New GZipStream(prevUncompressedStream, CompressionMode.Compress) 
    app.Response.AppendHeader("Content-Encoding", "gzip") 
End If 

末次