我有一个在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。
答案 0 :(得分:2)
在找到各种答案和建议启用runAllManagedModulesForAllRequests
的博客文章后,似乎这一点 - 虽然它有效 - 但不是正确的方法。
RAMMFAR完全按照它所说的那样执行并通过所有托管模块运行所有请求(包括“非托管”静态资源的请求),这些模块具有性能开销,并且还可能导致异常的副作用,具体取决于启用的模块和请求贯穿它们。
原来解决此问题所需的唯一模块是UrlRoutingModule
,当删除前提条件时,会导致所有静态资源通过MVC路由运行(当没有静态文件时):
<remove name="UrlRoutingModule" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"
preCondition="" />