ASP.NET MVC Route:绕过路径的静态文件处理程序

jmo*_*oss 17 .net c# asp.net-mvc routes httphandler

我一直在谷歌搜索和修补几个小时并没有取得太大进展,所以希望这里有人可以提供帮助.

我正在尝试将所有请求转到某个路径以由第三方组件处理.

编辑我需要所有其他路径的所有请求才能正常运行.

我正在使用带有通配符映射的路由处理程序,如下所示:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler()));
Run Code Online (Sandbox Code Playgroud)

所有传统路由都正确地转发到处理程序,处理程序很好地转发到第三方组件.当我点击静态文件(.html,.txt等)时,它们会被StaticFile处理程序而不是我的处理程序拾取,所以我试图像这样关闭StaticFile处理程序(简化):

<system.webServer>
  <handlers>
    <remove name="StaticFile"/>
  </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

这会关闭StaticFile处理程序,但MVC仍然不会选择路由.

我宁愿不再创建自己的处理程序并注入ASP请求堆栈,因为看起来应该有一个MVC快乐的方法来做到这一点.

有什么想法吗?谢谢.

Ken*_*Ito 15

这里有几个选项.

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

如果你真的想要通过asp.net管道运行所有请求,那么你需要.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

更新

另一个选项,特别是如果您需要绕过静态处理程序被限制为您的站点的子集,则使用以下选项

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

考虑到如何在mvc站点上,大多数静态文件是从几个众所周知的目录处理的,这是一个更好的选择.

  • 请注意:建议不要使用runAllManagedModulesForAllRequests ="true" - 有关详细信息,请参阅Hanselman文章.这可能会对性能产生负面影响. (4认同)
  • 不只是表现.当模块针对所有请求运行时,通过管道推送PDF和XML以及其他文件的URL可以产生有趣的结果.买者自负. (3认同)