一个 ASP MVC 应用程序中的多个应用程序根路径
Multiple application root paths in one ASP MVC application
我的网站结构非常典型,路径如下:
/home
/home/search
/categories
/categories/misc
我需要做的是在路径上放置一组动态前缀并将其映射到同一位置,更重要的是,在整个站点中保留该前缀。前缀不会一直存在,但是当它存在时,它需要保留。
例如,我希望 /client1/program1/home
映射到与 /home
相同的控制器 action/view,如果 /home
上有一个 link 引用Url.Content("~")
或Url.Action("categories")
,生成的URL需要保留请求的/client1/program1
前缀,例如后一种情况:/client1/program1/categories
。我需要在每个请求中保留该前缀,以维护特定 client/program 的自定义功能。我们通常使用子域和 DNS 来管理此问题,单独留下路径,但是这个特定的客户端在多个域上存在 运行 的合规性问题。
/client1/
部分是静态的,可以在代码中设置,因为它们很少更改,但是 /program1/
部分是动态的,我需要在不部署新代码的情况下支持那里的更改。
我一直在尝试通过 URL 重写、路由或自定义 VirtualPathProvider 的某种组合来获得一些东西,但似乎无法让它工作。会话和 cookie 不够可靠,因为它们会超时并可以被清除。将有太多地方需要更改以尝试在查询字符串上始终如一地获取它。
URL 重写会在应用程序看到路径信息之前将其删除。它仍然需要访问权限才能读取它应该显示的客户端和程序。
路由可以将请求发送到正确的控制器,但是来自该页面的后续请求将忽略 client/program 是什么。
自定义 VirtualPathProvider
感觉是最有前途的方向,但底层的物理路径实际上并没有改变。在站点根目录的另一个目录 运行 中有一个单独的应用程序似乎更有用。更改它不仅会更改所有路由和路径处理,还会更改引擎查找视图的能力。
有什么建议吗?
编辑:路由处理通过该引擎的路径,因此 Url.Action()
之类的东西可以与路由一起工作。我还有从 Url.Content()
生成的其他 URL,所以这可能是我真正要问的问题:如何更改 ~
映射到 Url.Content()
? 我想这就是我开始查看 VirtualPathProvider
的原因,我现在很确定它根本不是我需要的。它更侧重于映射到本地物理文件路径。
我不知道我是否遗漏了什么(因为这看起来微不足道),我在我的测试项目中试过了,它运行良好。
将此添加到您的路由配置中。
routes.MapRoute("custom", "client1/{program1}/{controller}/{action}");
然后,您可以使用HttpContext.Request
对象来查找program1
的值
如果可行,请告诉我。
我的网站结构非常典型,路径如下:
/home
/home/search
/categories
/categories/misc
我需要做的是在路径上放置一组动态前缀并将其映射到同一位置,更重要的是,在整个站点中保留该前缀。前缀不会一直存在,但是当它存在时,它需要保留。
例如,我希望 /client1/program1/home
映射到与 /home
相同的控制器 action/view,如果 /home
上有一个 link 引用Url.Content("~")
或Url.Action("categories")
,生成的URL需要保留请求的/client1/program1
前缀,例如后一种情况:/client1/program1/categories
。我需要在每个请求中保留该前缀,以维护特定 client/program 的自定义功能。我们通常使用子域和 DNS 来管理此问题,单独留下路径,但是这个特定的客户端在多个域上存在 运行 的合规性问题。
/client1/
部分是静态的,可以在代码中设置,因为它们很少更改,但是 /program1/
部分是动态的,我需要在不部署新代码的情况下支持那里的更改。
我一直在尝试通过 URL 重写、路由或自定义 VirtualPathProvider 的某种组合来获得一些东西,但似乎无法让它工作。会话和 cookie 不够可靠,因为它们会超时并可以被清除。将有太多地方需要更改以尝试在查询字符串上始终如一地获取它。
URL 重写会在应用程序看到路径信息之前将其删除。它仍然需要访问权限才能读取它应该显示的客户端和程序。
路由可以将请求发送到正确的控制器,但是来自该页面的后续请求将忽略 client/program 是什么。
自定义 VirtualPathProvider
感觉是最有前途的方向,但底层的物理路径实际上并没有改变。在站点根目录的另一个目录 运行 中有一个单独的应用程序似乎更有用。更改它不仅会更改所有路由和路径处理,还会更改引擎查找视图的能力。
有什么建议吗?
编辑:路由处理通过该引擎的路径,因此 Url.Action()
之类的东西可以与路由一起工作。我还有从 Url.Content()
生成的其他 URL,所以这可能是我真正要问的问题:如何更改 ~
映射到 Url.Content()
? 我想这就是我开始查看 VirtualPathProvider
的原因,我现在很确定它根本不是我需要的。它更侧重于映射到本地物理文件路径。
我不知道我是否遗漏了什么(因为这看起来微不足道),我在我的测试项目中试过了,它运行良好。
将此添加到您的路由配置中。
routes.MapRoute("custom", "client1/{program1}/{controller}/{action}");
然后,您可以使用HttpContext.Request
对象来查找program1
如果可行,请告诉我。