防止 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 线程?

ASP.NET Core使用静态文件目录游览与MIME类型管理

IIS 7开发与管理完全参考手册(第一章部分内容)

UrlRewriter配置IIS支持伪静态

谈谈IIS与ASP.NET管道

转载IIS与asp.net管道