首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC路由:绕过路径的静态文件处理程序

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

Stack Overflow用户
提问于 2012-06-29 15:28:40
回答 2查看 16.2K关注 0票数 19

我已经搜索和修补了几个小时,但没有真正取得太多进展,所以希望这里有人能帮助我。

我正在尝试让某个路径的所有请求都由第三方组件处理。

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

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

代码语言:javascript
复制
routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler()));

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

代码语言:javascript
复制
<system.webServer>
  <handlers>
    <remove name="StaticFile"/>
  </handlers>
</system.webServer>

这会关闭StaticFile处理程序,但是MVC仍然不会获得路由。

我不喜欢退回到创建我自己的处理程序并注入到ASP请求堆栈中,因为似乎应该有一种MVC愉快的方式来做到这一点。

有什么想法吗?谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 16:06:42

这里有几个选项。

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

如果您真的希望所有请求都通过asp.net管道运行,那么您需要。

代码语言:javascript
复制
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

更新

另一种选择是使用以下方法,尤其是当您需要绕过静态处理程序时,只能使用站点的一个子集

代码语言:javascript
复制
  <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站点上,大多数静态文件都是从几个众所周知的目录中处理的,这是一个更好的选择。

票数 17
EN

Stack Overflow用户

发布于 2013-04-26 18:00:04

最好的解决方案可能是使用URL Rewriter将来自原始URL的请求代理到一个MVC友好的替代方案。

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

代码语言:javascript
复制
RewriteRule ^/load/(\d+)/rel(\?.*)? -   [L]
RewriteRule ^/load/(\d+)/(.*)$  /load/$1/rel?path=$2    [P,QSA,L,NC]

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

代码语言:javascript
复制
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" }
    );

然后你的动作方法就很简单了:

代码语言:javascript
复制
 public ActionResult Index(int itemId) { ... }

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

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

例如:

代码语言:javascript
复制
/load/1234/file.xml

变成了

代码语言:javascript
复制
/load/1234/rel?path=file.xml

代理请求而不是进行客户端重定向也可以启用嵌套的相对路径(并对最终用户隐藏秘密)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11257768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档