2

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

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

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

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

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

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

所以我的问题有两个:

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

1 回答 1

2

Phil Haack 写了一篇文章来处理这个问题

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

于 2012-03-05T21:53:02.033 回答