ASP.NET MVC Route:绕过路径的静态文件处理程序
我一直在谷歌搜索和修补几个小时并没有取得太大进展,所以希望这里有人可以提供帮助。
我正在尝试将所有请求转到某个路径以由第三方组件处理。
编辑我需要所有其他路径的所有请求才能正常运行。
我正在使用带有通配符映射的路由处理程序,如下所示:
routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler()));
所有传统路由都正确地转发到处理程序,后者可以很好地转发到第三方组件。 当我点击静态文件(.html,.txt等)时,它们被StaticFile处理程序而不是我的处理程序拾取,所以我试图像这样关闭StaticFile处理程序(简化):
这会关闭StaticFile处理程序,但MVC仍然不会选择路由。
我宁愿不再创建自己的处理程序并注入ASP请求堆栈,因为看起来应该有一个MVC快乐的方法来做到这一点。
有什么想法吗? 谢谢。
这里有几个选项。
如果你真的想要通过asp.net管道运行所有请求,那么你需要。
更新
另一个选项,特别是如果您需要绕过静态处理程序被限制为您的站点的子集,则使用以下选项
考虑到如何在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
代理请求而不是进行客户端重定向使嵌套的相对路径也可以工作(并隐藏最终用户的秘密酱。)
- 为什么BackgroundWorker不需要在ProgressChanged事件处理程序中调用?
- 写一个锁是否保证在另一个线程中读取新内容? (.Net,内存模型)
- 强制EventProcessorHost将失败的Azure Event Hub eventData重新传递给IEventProcessor.ProcessEvents方法
- 用静态字段切换语句
- 如何使用XmlSerializer反序列化大型文档中的节点
- KeyVault GetSecretAsync永远不会返回
- 在.NET 4.5中找不到HttpClient
- C#扩展方法优先级
- 在学习ASP.NET和Sharepoint之前,我应该学习.NET和C#吗?