【问题标题】:Prevent IIS from serving static files through ASP.NET pipeline防止 IIS 通过 ASP.NET 管道提供静态文件
【发布时间】:2011-09-10 21:36:27
【问题描述】:

对我的 css、js、图像文件的请求正在通过 ASP.NET 管道提供服务。我认为 IIS 默认情况下会避免这种情况,但我在Application_AuthenticateRequest 断点上看到了请求,并且不需要对这些请求进行实际身份验证。我看到了改变这种行为的相互矛盾的方法 - 最好的方法是什么?

【问题讨论】:

    标签: asp.net-mvc forms-authentication iis-7.5 static-files


    【解决方案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 根目录中的设置,这意味着它适用于所有站点 - 请在此处查看处理程序映射。

      【讨论】: