【问题标题】:Multiple application root paths in one ASP MVC application一个 ASP MVC 应用程序中的多个应用程序根路径
【发布时间】: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


    【解决方案1】:

    我不知道我是否遗漏了一些东西(因为这似乎微不足道),我在我的测试项目中尝试了这个并且效果很好。

    将此添加到您的路线配置中。

    routes.MapRoute("custom", "client1/{program1}/{controller}/{action}");
    

    然后,您可以使用HttpContext.Request 对象来查找program1 的值

    让我知道这是否有效。

    【讨论】:

    • 复杂之处不仅在于获得正确的控制器/动作,还在于获得所有后续链接和引用,以包括初始请求中的相同客户端和程序,而无需触及每一个那些地方(这是一个大型的现有网站,这是不可行的)。基本上,/home/search 包含指向~/categories/misc 的链接,如果您直接转到/home/search,您会得到/categories/misc 的预期。如果您转到/client1/program1/home/search,则该链接需要指向/client1/program1/categories/misc 而不是/categories/misc
    • 在我的测试项目中,我将该路由置于所有其他路由之上(使其优先)。因此,在我的情况下,/client1/program1/home/about 上的任何链接都具有 /client1/program1 前缀。您确定您没有对链接进行硬编码吗?我使用Url.Action 来生成我的链接。
    • 不幸的是,我们混合使用了 Url.ActionUrl.Content("~"),虽然前者的路由工作正常,但波浪号总是返回到后者的站点根目录。
    • @icrf 这不是最优的。您可以创建自定义ActionFilterAttribute 并在OnActionExecuting 期间,使用Request.UrlReferrer 检查最后一页网址并按应有的方式更改当前网址(例如添加/client1/program1/ 前缀)。更多信息在这里msdn.microsoft.com/en-us/library/…
    • 我认为我对推荐人的信任甚至不如对 cookie 的信任。它确实会触发网站上的功能更改,所以我不希望它成为浏览器或代理可以剥离的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多