对于Orchard来说,个人以为要真正理解Orchard,必须理解其路由工作方式。

一、Orchard的自定义路由由三种类型组成

1、分发类:

HubRoute:其功能是按租户筛选出当前访问租户的路由

2、容器类:

shellRoute:其功能是按当前租户路由,如果此时没有其它路由,路由数据处理后,交由MVC的路由处理

3、插件类:

主要是: AliasRoute ,其主要功能是处理别名路由,当然其功能不仅如此。别名路由(如将:locahost/thisisolditem,变成locahost/i)通过保存在数据库中对照表AliasRecord来工作,此类由Orchard.Alias.Routes加入到路由描述中,在Orchard_Alias_AliasRecord表中查找是否有别名路由存在。

不论如何路由,最后都会交由标准的MVC路由管理

二、Orchard通过对IRouteProvider接口扫描,获取了一组关于RouteDescriptor的列表,并通过RoutePublisher类Publish方法将所有描述转换为租户路由

1、按 RouteDescriptor 的先级排列路由;

2、加入合理的域;

3、根据描述生成ShellRoute类型的路由;

4、第3步中,如果有插件路由,则ShellRoute类路由将其包装(图2);

5、将ShellRoute类路由包装在HubRoute类路由中,即除原如路由(MVC原生路由),其它路由均包装进了 HubRoute;

6、是后形成的可能是(插件类不一定启用)如下:

HubRoute(shellRoute(AliasRoute(MvcRouteHandler)));

三、由第二条及多租户运行时不难理解,Orchard访问情形

1、用户访问;

2、创建Host如果还没有的话;

3、形成租户设置列表;

4、通过URL来判断应该使用哪一个租户设置;

5、根据当前租户,使用HubRoute路由,筛选出当前租户路由,进行匹配;

6、找到合适的控制器执行操作;

四、以下是运行期,真实的数据截图

  1、路由集合(可见所有路由均被HubRoute包裹)

2、shellRoute

Orchard路由随记(一)的更多相关文章

  1. Orchard学习 02、orchard 路由

    Orchard对mvc路由重新做了包装,重写了asp.net的路由模块 一.路由模块类图 1.路由 Descriptor RouteDescriptor是对常规mvc路由的包装类,它的Route属性就 ...

  2. 微信分享—ios和安卓机制居然不一样!

     实际项目中,在做微信分享追踪的时候,遇到了一个百思不得其解的问题. 在加入了用户分享追踪功能之后,页面已经加载完成的情况下,安卓分享功能没有任何问题,ios却总是分享失败. 关于ios和安卓设备的差 ...

  3. Orchard源码分析(7.1):Routing(路由)相关

    概述 关于ASP.NET MVC中路由有两个基本核心作用,一是通过Http请求中的Url参数等信息获取路由数据(RouteData),路由数据包含了area.controller.action的名称等 ...

  4. 记一次服务器路由跟踪 (2019-01-23 TODO)

    记一次服务器路由跟踪 有用户反馈网站 无法访问. 现象如下: ping 没有反馈,确认了可以 ping 通其它的网站. tracert 跟踪到服务器商的内部就没的反应了. 同样一家的服务器商,另外一台 ...

  5. 真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记

    自从上次仙人梦里放了一张无字天书,解惑了WPR003N的秘诀后,渐渐的,就忘了这件这事情,连想好的评测都拖延了好多月了,毕竟路由是拿来用的,不是用来写什么陈词滥调的评测的,无意间,热爱白菜的我发现了一 ...

  6. 全世界仅有的唯一最高LINUX版本的白菜路由,支持NAND记

    在上上篇 真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记 里,有没有还记否之模式退一步,海阔天空 回到了远古时代的ar7 ...

  7. react中的路由配置踩坑记

    react 路由配置中,如果根路由(/)匹配一个组件,另一个路由(/list)在进行匹配的时候也会匹配到根路由(/),即在 /list 页面展示的时候 / 页面总是展示在上方. 此时如果想进行严格匹配 ...

  8. 记一次AngularJs 路由 $stateChangeStart不起作用(细节决定成败)

    var app= angular .module('app', [ 'ngAnimate', 'ngCookies', 'ngResource', 'ngSanitize', 'ngTouch', ' ...

  9. 【React踩坑记二】react项目实现JS路由跳转

    这里使用的是4.31版本的react-router-dom "react-router-dom": "^4.3.1", 直接使用以下代码即可实现路由跳转 thi ...

随机推荐

  1. BZOJ 1003 物流运输trans

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  2. Debug和Release之本质区别

    转自Debug和Release之本质区别 Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发 ...

  3. xstream 别名的用法<转>

    1.xstream的alias使用方法: 1.1 作用:将序列化中的类全量名称,用别名替换. 1.2  使用方法:xstream.alias("blog", Blog.class) ...

  4. JSP页面间传递参数的5种方法

    JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...

  5. Spring的applicationContext.xml文件

    以下是详解Spring的applicationContext.xml文件代码:<!-- 头文件,主要注意一下编码 --><?xml version="1.0" e ...

  6. 解除網頁無法選取文字、鎖右鍵限制:Enable Copy(Chrome 擴充套件)

    有些网页因会因为某些因素而禁止浏览者直接复制网页上的内容,虽然我们了解站方的意思,不过有些时候会造成一些不必要的困扰. Enable Copy 这款Chrome 扩充套件可以帮你一键解除封锁右键和选取 ...

  7. Delphi能通过SSH登录Linux,连接MYSQL取数么?像Navicat一样

    百度随时就能搜,你就懒得搜下.http://tieba.baidu.com/p/671327617 Ssh tunnel通常能实现3种功能1) 加密网络传输2) 绕过防火墙3) 让位于广域网的机器连接 ...

  8. C++ Virtual详解(注意函数被隐藏的问题)

    Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就 ...

  9. vs2010编译curl为static库及测试

    1,编译curl为static库 用vs2010打开: curl-7.32.0\vs\vc6\vc6curl.dsw 选择LIB Release生成libcurl静态库: curl-7.32.0\vs ...

  10. Windows消息对Edit控件的处理

    例如对windows发消息让文本选中. SendMessage(Text1.hwnd,EM_GETSEL,0,-1 ); EC_LEFTMARGIN(&H1) EC_USEFONTINF // ...