ASP.NET 4.0和IIS7中的HTTP压缩

3

我一直在尝试在我的几个网站上实现HTTP压缩。

我尝试使用以下两种技术的变体来实现HTTP压缩:

从Global.asax中的Application_BeginRequest开始

从自定义HttpModule开始

在这两种情况下,它最初似乎有效。 但是,当我在网站上浏览时,我很快失去了CSS样式。 浏览器报告JS文件包含无效字符。 而且,在某个时候,整个网站都变成了乱码。

我真希望知道这里发生了什么。 有人有任何建议吗? 是因为这些技术只适用于较旧版本的ASP.NET / IIS吗?

编辑:我没有访问IIS的权限,也不需要它。随着ASP.NET和IIS的最新版本,越来越多的控制权被赋予了web.config,而不需要涉及IIS。这应该得到全面支持,而且事实上,上面提供的两个链接声称他们能够做到这一点。只是我无法使其对我起作用。

编辑:经过进一步检查,使用上面第二个链接(HTTP模块)中的代码,我可以看到我的网站上所有文件类型都调用了模块处理程序。这显然是问题的一部分。(请注意,在某些情况下,整个页面都会变成垃圾,这表明存在其他问题。)有人能否建议是什么决定了哪些文件被发送到HTTP处理程序,或者为什么那个链接的代码对别人有效但对我无效?


1
你提到的压缩方法仅适用于动态的aspx代码。CSS和JS是静态文件,只能通过配置IIS进行压缩。这些请求通常不会被ASP.NET处理,除非你重新配置了IIS以强制处理它们。 - Samuel Neff
@Samuel:我没有做出任何影响ASP.NET处理哪些文件的更改。我可以告诉你更多,但说实话,我不确定还有哪里需要查找。 - Jonathan Wood
@Jonathan Wood,使用HTTP代理来查看实际发送到网络的内容。我更喜欢Charles(http://www.charlesproxy.com/),但Fiddler也很好用。当你说“胡言乱语”时,你能够确定它是什么吗?它是否被gzip压缩但没有被标记为gzip并且在客户端上没有被正确解压缩?也许它被双重压缩了? - Samuel Neff
@Jonathan Wood,是的,Charles和其他HTTP代理在本地肯定有效。它们是很棒的工具。我明白你所说的“胡言乱语”,但我的观点是人们认为的“胡言乱语”几乎从来不是真正的随机数据。虽然它不是你期望的,但它是可以解释的,只是要确定到底发生了什么,通常会导致识别问题。也许您的自定义HTTP模块正在压缩数据,但没有发送头文件来指示这些文件类型已经被压缩。 - Samuel Neff
@Samuel:嗯,我不是电脑新手。我知道它来自何处。但是,例如,如果我正在查看未解压缩的压缩数据,那对于人类来说肯定会看起来像胡言乱语。至少,这就是我试图传达的想法。 - Jonathan Wood
显示剩余3条评论
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3

IIS 7原生支持压缩 - 不需要编码。除非你试图在未启用压缩的托管提供商上实现它,但这在你的问题中没有明确说明。


正如我一直在尝试的技巧链接所示,我想在ASP.NET端处理此问题。考虑到ASP.NET 4.0和IIS7之间的改进集成,这应该是可行的。并且,从那些链接中可以看出,人们正在这样做。 - Jonathan Wood

1

虽然我在这里遇到了一些问题,但是Walkthrough: Creating and Registering a Custom HTTP Module中的以下引用似乎阐明了问题:

如果ASP.NET应用程序在IIS 6.0下运行,则可以使用HTTP模块自定义由ASP.NET服务的资源的请求。这包括ASP.NET Web页面(.aspx文件)、Web服务(.asmx文件)、ASP.NET处理程序(.ashx文件)以及您映射到ASP.NET的任何文件类型。如果ASP.NET应用程序在IIS 7.0下运行,则可以使用HTTP模块自定义由IIS服务的任何资源的请求。这不仅包括ASP.NET资源,还包括HTML文件(.htm或.html文件)、图形文件等。

正如我开始怀疑的那样,这是ASP.NET 4.0和IIS7中的一个变化。正如我已经多次提到的,它们越来越集成。上面的引用表明HTTP模块现在处理IIS服务的所有文件类型。

所以这就是为什么旧代码对我不起作用的原因。修复方法似乎很简单,只需从我的处理程序检查文件类型即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,