首页 文章

提供静态文件并回退到 MVC 路由

提问于
浏览
3

我有一个在 IIS 8.5 下运行的 ASP.NET MVC 4 应用程序。我之前在 MVC 中的这些场景中有三个是如果存在静态文件,它将被提供。如果它不存在,则路径将通过 MVC 路由发送。这是期望的行为,但似乎没有发生。

默认情况下,如果我在/blah.html创建一个 catchall 路由并且没有相应的静态文件,则 IIS 提供 404(由 StaticFile 处理程序提供)。 MVC 路线从未被击中。如果该文件存在,则提供该文件。

所以,我做了一些谷歌搜索并与同事聊天,并提出了答案,如下所示:

https://stackoverflow.com/a/14327897/1043198

进去处理程序:

<add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />

大!该请求现在命中 MVC 应用程序,我的动态内容按预期提供。除了现在,当我放置一个物理文件时,我再次收到错误。带有以下信息的无信息 500 错误(没有别的):

模块: ManagedPipelineHandler

通知: ExecuteRequestHandler

处理程序: ApiURIs-ISAPI-Integrated-4.0

错误代码: 0x800703e9

这是怎么回事?当静态文件不存在时,为什么 IIS 不会回到我的 MVC 应用程序?当我修复它时,为什么会发生反转并且静态文件不再正常运行?我很确定这一直是过去的默认行为。

应用程序池以集成模式 CLR v4.0 运行。

1 回答

  • 2

    在找到各种答案和建议启用runAllManagedModulesForAllRequests的博客文章后,似乎这 - 虽然它有效 - 但不是正确的方法。

    RAMMFAR 完全按照它所说的那样执行,并通过所有托管模块运行所有请求(包括“非托管”静态资源的请求),这些模块具有性能开销,并且还可能导致异常 side-effects,具体取决于启用的模块以及通过它们运行的请求。

    事实证明,解决此问题所需的唯一模块是UrlRoutingModule,当删除前提条件时,会导致所有静态资源通过 MVC 路由运行(当没有静态文件时):

    <remove name="UrlRoutingModule" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"   
        preCondition="" />
    

相关问题