我正试图了解Orchard CMS中多租户和路由的工作原理。
据我所知,当Orchard启动新的shell(租户)时,将加载该租户的所有活动模块,并且任何实现IRouteProvider
的模块“发布”其路由。然后为每个路由添加ShellRoute
,该路由仅匹配对该租户的主机名/后缀的请求。
然后MVC以正常方式处理请求(在RouteTable.Routes
中查找匹配项)。
我无法弄清楚是如何调用默认的ItemController
,因为我在源代码中找不到默认路由。另外我注意到在浏览主页时,id
路由参数填充了主页内容项的参数,所以我假设在控制器被命中之前还有某种预处理?< / p>
答案 0 :(得分:3)
默认IRouteProvider
- Orchard.Mvc.Routes.StandardExtensionRouteProvider
。它负责以{module}/{controller}/{action}/{id}
格式向控制器注册默认路由。
是的,你是对的 - 正在进行一些预处理。简要说明:
Contents/Item/Display/{id}
。这些映射保存在数据库中(AliasRecord
和ActionRecord
)。Route
实施 - AliasRoute
。然后,为每个模块注册一次该路由,并处理与现有别名匹配的请求。这一切都发生在Orchard.Alias
模块中。AliasRoute.GetRouteData
的调用将返回基础映射。这样ASP.NET MVC框架就知道要调用哪个动作。