ASP.NET,GZip和.AXD动态文件打得不好

时间:2014-02-07 14:15:08

标签: asp.net gzip webresource.axd scriptresource.axd

我无法尝试为我正在处理的( )网站启用压缩功能。我认为我已经完成了所有工作,但是当我动态加载文件时,它们会被压缩,因此页面无法加载依赖于上述文件的内容或(在调试时)打破了无数的javascript运行时异常,即;无效的角色。

这是我的Global.ascx.cs代码的一部分,显然是连接到PostReleaseRequestState事件。

void OnGlobalPostReleaseRequestState(object sender, EventArgs e)
{    
        string contentType = Response.ContentType;

        // Compress only html, style-sheet, and javascript documents.
        switch (contentType)
        {
            case "application/x-javascript":
            case "text/javascript":
            case "text/css":
            case "text/html":
                {
                    // Get the Accept-Encoding header value to know whether zipping is supported by the browser or not.
                    string acceptEncoding = Request.Headers["Accept-Encoding"];
                    if (string.IsNullOrEmpty(acceptEncoding)) return;

                    // If gzip is supported then gzip it else if deflate compression is supported then compress in that technique.
                    if (acceptEncoding.Contains("gzip"))
                    {
                        // Compress and set Content-Encoding header for the browser to indicate that the document is zipped.
                        Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress);
                        Response.AppendHeader("Content-Encoding", "gzip");
                    }
                    else if (acceptEncoding.Contains("deflate"))
                    {
                        // Compress and set Content-Encoding header for the browser to indicate that the document is zipped.
                        Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress);
                        Response.AppendHeader("Content-Encoding", "deflate");
                    }
                }
                break;
        }
    }

我的web.config包含相关部分。

<!-- language-all: lang-xml -->
<staticContent>
  <!-- Override IIS default, thus allowing JavaScript compression -->
  <remove fileExtension=".js" />
  <mimeMap fileExtension=".js" mimeType="text/javascript" />
</staticContent>
<httpCompression directory="%SystemDrive%\websites\_compressed" minFileSizeForComp="256">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
  <staticTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/javascript" enabled="true" />
    <add mimeType="application/json" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </staticTypes>
  <dynamicTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="false" />
    <add mimeType="*/*" enabled="false" />
  </dynamicTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />
<httpProtocol>
  <customHeaders>
    <add name="Content-Encoding" value="gzip" />
    <add name="X-UA-Compatible" value="IE=9" />
  </customHeaders>
</httpProtocol>

我需要禁用(* .axd)压缩,或者强制它在客户端上解压缩。请帮忙......

1 个答案:

答案 0 :(得分:3)

好的,所以我想出了我的问题的答案......显然是问我需要做的全部问题,自己回答。首先,IE在确定缓存动态(* .axd)文件方面很糟糕,因此我只需要清除IE的缓存(和历史记录)并对请求添加一个简单的检查,如下所示。

void OnGlobalPostReleaseRequestState(object sender, EventArgs e)
{
    if (Request.RawUrl.Contains("ScriptResource.axd", StringComparison.OrdinalIgnoreCase))
    {
        return;
    }

    string contentType = Response.ContentType;

    // Compress only html, style-sheet, and javascript documents.
    switch (contentType)
    {
        case "application/x-javascript":
        case "text/javascript":
        case "text/css":
        case "text/html":
            {
                // Get the Accept-Encoding header value to know whether zipping is supported by the browser or not.
                string acceptEncoding = Request.Headers["Accept-Encoding"];
                if (string.IsNullOrEmpty(acceptEncoding)) return;

                // If gzip is supported then gzip it else if deflate compression is supported then compress in that technique.
                if (acceptEncoding.Contains("gzip"))
                {
                    // Compress and set Content-Encoding header for the browser to indicate that the document is zipped.
                    Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress);
                    Response.AppendHeader("Content-Encoding", "gzip");
                }
                else if (acceptEncoding.Contains("deflate"))
                {
                    // Compress and set Content-Encoding header for the browser to indicate that the document is zipped.
                    Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress);
                    Response.AppendHeader("Content-Encoding", "deflate");
                }
            }
            break;
    }
}

详细here - ScriptResource.axd会自动压缩,知道这一点后,我现在可以过滤掉包含作为原始网址一部分的所有请求。

使用fiddler我能够看到(ScriptResource.axd)文件在其标题中有两个“内容编码”的“gzip”,一个是自动发生的,另一个是我追加的。 / p>

双重压缩==主要问题! :)