【发布时间】:2015-12-28 13:03:44
【问题描述】:
我的网站结构非常典型,路径如下:
/home
/home/search
/categories
/categories/misc
我需要做的是在路径上放置一组动态前缀并将其映射到同一个位置,更重要的是,在整个站点中保留该前缀。前缀并不总是存在,但当它存在时,它需要保留。
例如,我希望/client1/program1/home 映射到与/home 相同的控制器操作/视图,并且如果/home 上有引用Url.Content("~") 或Url.Action("categories") 的链接,则生成的URL 需要保留请求的/client1/program1 前缀,例如在后一种情况下:/client1/program1/categories。我需要该前缀保留在每个请求中,以维护该特定客户端/程序的自定义功能。我们通常使用子域和 DNS 来管理这个问题,不理会路径,但是这个特定的客户端在多个域上运行时存在合规性问题。
/client1/ 部分是静态的,可以在代码中设置,因为它们不经常更改,但 /program1/ 部分是动态的,我需要在不部署新代码的情况下支持那里的更改。
我一直在尝试使用 URL 重写、路由或自定义 VirtualPathProvider 的某种组合来实现某些功能,但似乎无法使其正常工作。会话和 cookie 不够可靠,因为它们超时并且可以被清除。将有太多地方需要更改以尝试在查询字符串上保持一致。
URL 重写会在应用程序看到路径信息之前将其剥离。它仍然需要访问权限才能读取它应该显示的客户端和程序。
路由可以将请求发送到正确的控制器,但来自该页面的后续请求会忽略客户端/程序的任何内容。
自定义VirtualPathProvider 感觉是最有前途的方向,但底层物理路径实际上并没有改变。在站点根目录中运行的另一个目录中拥有单独的应用程序似乎更有用。更改它不仅会更改所有路由和路径处理,还会更改引擎查找视图的能力。
有什么建议吗?
编辑:路由处理通过该引擎的路径,因此Url.Action() 之类的内容可以正常处理路由。我还有从 Url.Content() 生成的其他 URL,所以这可能是我真正要问的问题:如何更改 ~ 映射到 Url.Content() 中的内容? 我认为这就是为什么我开始查看VirtualPathProvider,我现在很确定这根本不是我需要的。它更侧重于映射到本地物理文件路径。
【问题讨论】:
标签: asp.net-mvc url-rewriting routes url-routing