在Win7 x64机顶盒上使用Internet Explorer 8,Firefox 3.6,Chrome 8和IIS 7.5。
我正在使用IHttpHandler(.NET 4)提供文件。
根据Fiddler的说法,IE8的IIS请求说它接受了gzip,但是没有返回:
(注意loc.portal.com实际上是127.0.0.1)
GET http://loc.portal.com/AdminCenter/FileHandler.ashx?ID=115 HTTP/1.1 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */* Accept-Language: en-US User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; MS-RTC LM 8; InfoPath.3) Accept-Encoding: gzip, deflate Connection: Keep-Alive Host: loc.portal.com Cookie: LoginName=; ASP.NET_SessionId=d5qiw5nubkjd2r00gnebg3ar; .ASPXAUTH=BAEA blah blah
从IIS返回到IE的标头:
HTTP/1.1 200 OK Cache-Control: private Transfer-Encoding: chunked Content-Type: application/msword Server: Microsoft-IIS/7.5 Content-Disposition: attachment; filename="Roll Worksheet.doc" X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Mon, 24 Jan 2011 20:53:34 GMT
注意它没有被压缩。
但是,对于Firefox,请求如下所示:
GET http://loc.portal.com/AdminCenter/FileHandler.ashx?ID=115 HTTP/1.1 Host: loc.portal.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Referer: http://loc.portal.com/sb.cn Cookie: ASP.NET_SessionId=hw104pctkzrdtciwg4ihriqx; .ASPXAUTH=4FBB blah blah
正确的回答是,它正在返回gzip:
HTTP/1.1 200 OK Cache-Control: private Transfer-Encoding: chunked Content-Type: application/msword Content-Encoding: gzip Server: Microsoft-IIS/7.5 Content-Disposition: attachment; filename="Roll Worksheet.doc" X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Mon, 24 Jan 2011 20:55:07 GMT
Chrome看起来与Firefox类似。它要求返回gzip和gzip。我可以通过Fiddler中显示的内容大小看出,实际上,正在为Chrome和Firefox而不是IE浏览器。
我在IIS中设置了“启用动态内容压缩”(以及静态内容压缩)。我的IHttpHandler没有对压缩做任何特殊处理,也没有为不同的浏览器运行不同的代码。我搜索了我的项目的源代码,我没有看到任何提及“gzip”,所以我看不出我怎么会不小心弄乱它。
我如何弄清楚为什么IIS没有向IE发送gzip压缩数据?
答案 0 :(得分:0)
当我使用IE发出请求时,我看到context.Response.Filter == System.Web.HttpResponseStreamFilterSink。 当我使用Firefox或Chrome发出请求时,我看到context.Response.Filter == RadGZipStreamNet40。 根据IIS“失败的请求跟踪”日志*,内置的IIS动态压缩根本不会触发。显然Telerik决定不应该压缩来自IE的调用,而应该是来自其他浏览器的调用。
根据文件:
RadCompression将自动检测并压缩期望这些内容响应类型的请求: 应用程序/ x-WWW窗体-urlencoded 应用程序/ JSON 应用程序/ XML 应用/原子+ xml的 (来源:http://www.telerik.com/help/aspnet-ajax/radcompression.html)
其他浏览器报告他们接受“application / xml”,因此RadCompress会对响应进行gzip压缩。 IE不报告它接受任何这些东西,所以它没有。