ASP.NETMVC路由:如何绕过用于路径的静态文件处理程序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (83)

我一直在用google和修补几个小时,并没有真正取得很大的进展,所以希望这里有人能够提供帮助。

我试图让所有的请求到一个特定的路径由第三方组件处理。

我需要所有其他路径的行为正常。

我正在使用像这样的通配符映射的路由处理程序:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler()));

所有传统路线都正确转发给处理程序,该处理程序很好地转发给第三方组件。当我打击静态文件(.html,.txt等)时,它们会被StaticFile处理程序而不是我的处理程序拾取,所以我试图关闭StaticFile处理程序,如下所示(简化):

<system.webServer>
  <handlers>
    <remove name="StaticFile"/>
  </handlers>
</system.webServer>

这会关闭StaticFile处理程序,但是MVC仍然没有选择路径。

我不希望回到创建自己的处理程序和注入ASP请求堆栈,因为似乎应该有一个MVC快乐的方式来做到这一点。

有什么想法吗?

提问于
用户回答回答于

这里有几个选项。

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

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

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

另一种选择,特别是如果需要绕过静态处理程序受限于网站的一个子集,则使用以下选项

  <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" />

考虑到在MVC站点上,大多数静态文件是从几个著名的目录中处理的,这是一个更好的选择。

用户回答回答于

对此的最佳解决方案可能是使用URL重写器将原始URL的请求代理为MVC友好选择。

例如,假设需要能够自动加载从数据库提供的内容中的相对URL。

RewriteRule ^/load/(\d+)/rel(\?.*)? -   [L]
RewriteRule ^/load/(\d+)/(.*)$  /load/$1/rel?path=$2    [P,QSA,L,NC]

这些规则将允许设置两条MVC路由:

routes.MapRoute(
    "Load Item",
    "load/{itemId}",
    new { controller = "Load", action = "Index" }
    );

routes.MapRoute(
    "Load Relative Item",
    "load/{itemId}/rel",   //?path=
    new { controller = "Load", action = "Relative" }
    );

然后,操作方法很简单:

 public ActionResult Index(int itemId) { ... }

 public FileStreamResult Relative(int itemId, string path) { ... }

第一个重写规则是为了防止包含/ rel的路径被重写; 他们已经在最后的形式。第二个重写规则代理(而不是重定向)请求。

/load/1234/file.xml

变成

/load/1234/rel?path=file.xml

通过代理请求而不是执行客户端重定向,嵌套的相对路径也可以工作(并且隐藏最终用户的秘密)。

扫码关注云+社区

领取腾讯云代金券