【问题标题】:IIS 8 - Static file requests going through managed pipeline in spite of runAllManagedModulesForAllRequests="false"IIS 8 - 尽管 runAllManagedModulesForAllRequests="false" 仍然通过托管管道的静态文件请求
【发布时间】:2013-08-20 04:00:13
【问题描述】:

我有一个 ASP.NET MVC 2 Web 应用程序,它在我的本地 Cassini 服务器上运行良好,几个月前我上次针对 IIS 7.5 对其进行测试时它也运行良好。

我的 web.config 看起来像这样(不相关部分已删除):

<?xml version="1.0"?>
<configuration>

    <system.web>

        <authentication mode="Forms">
            <!-- 2880 minutes is 48 hours -->
            <forms loginUrl="~/Welcome/Login" timeout="2880" slidingExpiration="true" />
        </authentication>

        <customErrors mode="RemoteOnly" />

        <httpHandlers>
            <remove verb="*"     path="*.asmx" />
            <add verb="*"        path="*.asmx"             validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add verb="*"        path="*_AppService.axd"   validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </httpHandlers>

        <httpModules>
            <add name="ScriptModule"     type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </httpModules>

    </system.web>

    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="ScriptModule"/>
            <remove name="UrlRoutingModule"/>
            <add name="ScriptModule"     preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="UrlRoutingModule"                               type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </modules>
        <handlers>
            <remove name="WebServiceHandlerFactory-Integrated"/>
            <remove name="ScriptHandlerFactory"/>
            <remove name="ScriptHandlerFactoryAppServices"/>
            <remove name="ScriptResource"/>
            <remove name="UrlRoutingHandler"/>
            <add name="ScriptHandlerFactory"            preCondition="integratedMode" verb="*"        path="*.asmx"             type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="ScriptHandlerFactoryAppServices" preCondition="integratedMode" verb="*"        path="*_AppService.axd"   type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="ScriptResource"                  preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="UrlRoutingHandler"               preCondition="integratedMode" verb="*"        path="UrlRouting.axd"     type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </handlers>
        <httpErrors>
            <remove statusCode="404" subStatusCode="-1" />
            <error statusCode="404" prefixLanguageFilePath="" path="Views\Shared\Iis404.htm" responseMode="File" />
        </httpErrors>

    </system.webServer>

</configuration>

我现在将它部署到 Azure VM 上的 IIS 8 并请求静态内容,例如/Styles/style.css 通过托管请求管道,因为我有一个身份验证系统,这意味着这些请求被阻止并替换为我的应用程序的登录屏幕。

我找到了这个 QA (Prevent IIS from serving static files through ASP.NET pipeline) 并将 &lt;modules runAllManagedModulesForAllRequests="true"&gt; 更改为 &lt;modules runAllManagedModulesForAllRequests="false"&gt;,但这并没有解决它:对 /Styles/style.css 的请求仍然导致我的 ASP.NET MVC 代码被调用(它调用我的 WelcomeController 类上的 Login 操作失败,因为现在 Controller.User 属性返回 null)。

我不知道 IIS8 中的任何更改会触发此问题 - 但我该如何修复它?

更新:

我将此添加到我的 Global.asax.cs 但它不起作用:

routes.IgnoreRoute("Scripts/{*pathInfo}");
routes.IgnoreRoute("Styles/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");

更新:我已经在我的 Windows 8 Enterprise 笔记本电脑上安装了 IIS 8,令我惊讶的是,它可以正常工作 - 所以我的 Windows 8 笔记本电脑和 Server 2012 Azure VM 之间存在一些配置差异。嗯。

【问题讨论】:

    标签: asp.net-mvc iis routing iis-8


    【解决方案1】:

    我开始寻找本地机器和 Azure VM 的 IIS 配置之间的差异,并找到了解决方案:

    我忽略了 IIS > {website} > Authentication > Anonymous 配置:在 Azure VM 上,它被设置为 Specific user 用于不存在的用户!而在我的本地 IIS 中,它被设置为 Application pool identity

    我将其更改为 应用程序池标识,现在它可以按预期工作了。

    我很惊讶 IIS 没有给我任何其他错误消息或更有用的方法来诊断问题。呵呵。

    【讨论】: