防止 IIS 通过 ASP.NET 管道提供静态文件
Posted
技术标签:
【中文标题】防止 IIS 通过 ASP.NET 管道提供静态文件【英文标题】:Prevent IIS from serving static files through ASP.NET pipeline 【发布时间】:2011-09-10 21:36:27 【问题描述】:对我的 css、js、图像文件的请求正在通过 ASP.NET 管道提供服务。我认为 IIS 默认情况下会避免这种情况,但我在Application_AuthenticateRequest
断点上看到了请求,并且不需要对这些请求进行实际身份验证。我看到了改变这种行为的相互矛盾的方法 - 最好的方法是什么?
【问题讨论】:
【参考方案1】:我在这里猜测并怀疑您在web.config
文件中配置了以下设置:
<modules runAllManagedModulesForAllRequests="true">
这意味着每个请求(包括静态内容的请求)都会进入管道。
将此设置更改为:
<modules runAllManagedModulesForAllRequests="false">
这是假设您的应用程序在 ASP.NET 4.0 和 MVC3 下运行。
为此,您需要安装 KB980368(需要重新启动)或 Windows 2008R2 SP1(包括此修补程序)。这篇优秀的文章解释了这样做的原因:
How ASP.NET MVC Routing Works and its Impact on the Performance of Static Requests
【讨论】:
这可行,但我真的不想更改该设置,因为它会影响其他内容。希望有替代品 @qntmfred - 哦,你好 :)。您是否有机会更新您的问题并解释 “因为它会影响其他内容”的意思。? 当然,但我得先记住它是什么>。 我实际上是这样做的,而且效果很好,对于我的自定义模块,我使用 precondition="managedHandler"。 @jackncoke - 我想是的。我现在有点脱离 ASP.NET/MVC/IIS 开发空间,所以没有机会检查。吸一口,看看:)【参考方案2】:我最终将它添加到我的 web.config 中。我知道我所有的静态文件都将存在于这些文件夹中,因此可以满足我的需要。
<location path="scripts">
<system.web>
<authentication mode="None" />
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
<location path="styles">
<system.web>
<authentication mode="None" />
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
<location path="images">
<system.web>
<authentication mode="None" />
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
【讨论】:
'path' 属性中是否允许多个值?根据以下链接,它们不是:***.com/questions/4608764/… 这只是阻止身份验证,但静态文件请求仍在访问您的托管模块。 @Kev 有正确的答案。 你不能在不改变 applicationhost.config 设置的情况下覆盖 ,你这样做了吗?【参考方案3】:在启用了 Visual Studio 开发服务器的 VS2012 /MVC3 中,RAMMFAR=false 无效。静态文件的每个请求仍然会触发 Application_BeginRequest 事件处理程序。
我切换到 IIS Express 并看到了所需的功能。
【讨论】:
【参考方案4】:在您的 IIS 配置或 web.config 中的某处,您设置了一个处理程序映射来将这些文件映射到您的 ASP.Net 应用程序。
尝试删除您的 web.config,看看您是否仍然可以在没有 ASP.Net 的情况下从 IIS 中浏览到这些文件类型。如果失败,您将知道这是您的 web.config - 否则您将不得不检查 IIS 设置。
第 2 步 - 将 web.configs 放回去,然后删除并重新创建站点 - 同样的问题?这是 IIS 根目录中的设置,这意味着它适用于所有站点 - 请在此处查看处理程序映射。
【讨论】:
以上是关于防止 IIS 通过 ASP.NET 管道提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章
IIS7 集成与经典管道 - 使用更多 ASP.NET 线程?