【问题标题】:dynamic routing based on database entries基于数据库条目的动态路由
【发布时间】:2012-03-05 21:32:43
【问题描述】:

正如经常发生的那样,我对一个问题有一个很好的解决方案,但不幸的是会导致另一个问题。

我们有一个应用程序,它为各个组织的成员提供服务,这些组织的成员是较大的母公司的一部分。组织需要自定义 URL。因此,组织 A 的成员访问 URL https://server/vdir/OrgA,组织 B 的成员访问 URL https://server/vdir/OrgB

这两者都将映射到应用程序中完全相同的区域、控制器和操作,尽管由于某些自定义视图内容,它们在最终用户看来可能有所不同。

因为使用此应用程序的组织列表是动态的,而且并非所有组织都会同时开始使用它,所以我开始以编程方式设置路线映射。在目标区域中,我重写了 RegisterArea 方法,从数据库中提取活动组织,并为每个组织执行自定义 context.MapRoute 调用。

这样做可以避免另一个问题,即其中包含组织站点路径(“OrgA”)的 URL 看起来与其中包含有意义的区域名称的 URL 完全一样,实际上确实映射到一个区域。将组织站点路径视为虚拟区域名称并将它们显式映射到目标区域可避免某些误导。

这很好用。但是:这一切都在 Application_Start 处执行。如果我们添加一个组织,它在我们重新启动应用程序之前不会变为活动状态,这将对当时正在使用它的任何人造成极大的破坏。

所以我的问题有两个:

  1. 有没有比我更好的方法来做到这一点?我确实研究了这个问题,但相关的关键字无处不在,以至于有点像大海捞针。
  2. 如果没有,有没有办法在不重启应用的情况下刷新路由映射?

【问题讨论】:

    标签: asp.net-mvc-3 dynamic asp.net-mvc-routing asp.net-mvc-3-areas


    【解决方案1】:

    Phil Haack 写了一篇文章dealing with exactly this problem

    真正非常简短的版本是,您将路线注册放在 Global.asax 以外的文件中,并缓存该文件的内容。缓存将文件作为依赖项,并在缓存失效(读取:文件已更改)时调用一个方法,以重新注册您的路由。

    【讨论】:

    • 我认为在我的情况下,我们会尝试基于 SQL Server 依赖项做一些事情:当我们的组织缓存失效并刷新时,我们会重新注册路由。但原理是一样的。非常感谢这篇文章的指针!
    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2020-10-28
    • 2016-10-11
    • 1970-01-01
    • 2020-01-12
    • 2019-06-07
    相关资源
    最近更新 更多