Orchard源码分析(3):Orchard.WarmupStarter程序集
Orchard.WarmupStarter程序集包含三个类:WarmupUtility、WarmupHttpModule和Starter<T>。该程序集主要为Orchard应用启动初始化服务。
一、WarmupUtility类 该类是一个静态工具类,包含一个静态只读String型字段WarmupFilesPath,以及三个方法EncodeUrl、ToUrlString和DoBeginRequest。
但第二次(刷新页面)及以后的请求将可能导致请求如果找不到合适的路由,将会显示404错误页:

然后启动控制台应用程序,运行一段时间后再看任务管理器,WebDev.WebServer40.EXE的线程数达到129个。在我的电脑上,这时候控制台程序已经报异常"远程服务器返回错误: (503) 服务器不可用。"
退出控制台程序,马上在浏览器打开:http://localhost:10670/,出现错误: 
Orchard.WarmupStarter程序集正是为了解决这些问题。Orchard的初始化步骤如下:
1、在第1次请求发生时,Application_Start方法得以执行,创建 Orchard.WarmupStarter.Starter<T>对象,并调用该对象的OnApplicationStart方法。 OnApplicationStart方法又调用LaunchStartupThread方法。
2、LaunchStartupThread方法会通过线程池启动一个新的线程进行异步初始化操作。
3、在异步BeginRequest事件处理完成后,将处理同步BeginRequest事件。事件处理程序将检查上一次初始化请求是否有异常发生;如果 检查到有异常发生,则会再次执行LaunchStartupThread方法尝试新的初始化操作;如果新的初始化没有异常发生,就"忘记"上次初始化出现 过异常,否则将本次异常进行记录,抛出上次初始化异常。 注意:在再次执行LaunchStartupThread方法时,如果有新的请求进入,也会将请求的异步BeginRequest处理"暂停"在那里,直到初始化完成。请查看Starter<T>的OnBeginRequest方法的代码:
可以放心,如果上次初始化出现异常,不会导致多个同步BeginRequest事件处理程序尝试都去执行LaunchStartupThread方法,Orchard加了个lock以保证线程安全。
初始化完毕后,WebDev.WebServer40.EXE的线程数有所下降,但是CPU却消耗很多,这是因为它现在正在处理10000个等待的请求,所以是正常的: 
别忘记了最初我们分析的WarmupUtility类,为了在初始化的同时能够响应用户请求,我们在"~/App_Data/Warmup/"对应目录下 手工新建一个名为"http_3A_2F_2Flocalhost_3A30320_2Forchardlocal"的文件,当然具体文件名要根据实际情 况来定。再次初始化网站并运行控制台测试程序:

Orchard源码分析(3):Orchard.WarmupStarter程序集的更多相关文章
- Orchard源码分析(5):Host相关(Orchard.Environment.DefaultOrchardHost类)
概述 Host 是应用程序域级的单例,代表了Orchard应用程序.其处理应用程序生命周期中的初始化.BeginRequest事件.EndRequest事件等. 可以简单理解为HttpApplicat ...
- Orchard源码分析(1):Orchard架构
本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译. 源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象.所以先对Orchard架构有 ...
- Orchard源码分析(2):Orchard.Web.MvcApplication类(Global)
概述 分析一个的ASP.NET项目源码,首先可以浏览其项目结构,大致一窥项目其全貌,了解项目之间的依赖关系.其次可以浏览Web.config和Global.asax文件,找到应用程序的入口点. 本 文 ...
- Orchard源码分析(6):Shell相关
概述在Orchard中,提出子站点(Tenant)的概念,目的是为了增加站点密度,即一个应用程序域可以有多个子站点. Shell是子站点(Tenant)级的单例,换句话说Shell代表了子站点.对比来 ...
- Orchard源码分析(5.1):Host初始化(DefaultOrchardHost.Initialize方法)
概述 Orchard作为一个可扩展的CMS系统,是由一系列的模块(Modules)或主题(Themes)组成,这些模块或主题统称为扩展(Extensions).在初始化或运行时需要对扩展进行安装:De ...
- Orchard源码分析(4.3):Orchard.Events.EventsModule类(Event Bus)
概述 采用Event Bus模式(事件总线),可以使观察者模式中的观察者和被观察者实现解耦. 在.Net 中使用观察者模式,可以使用事件(委托)和接口(类).Orchard Event Bus使用的 ...
- Orchard源码分析(1):插件式的支持——模块和主题
在Orchard,模块和主题都是可以插拔式的,在源码处理时,用类型(参考:DefaultExtensionTypes)区分,都没太大的本质区别,以下都称做模块. 插件的支持,实现分以下几步: 搜集模块 ...
- Orchard源码分析(7.1):Routing(路由)相关
概述 关于ASP.NET MVC中路由有两个基本核心作用,一是通过Http请求中的Url参数等信息获取路由数据(RouteData),路由数据包含了area.controller.action的名称等 ...
- Orchard源码分析(4.4):Orchard.Caching.CacheModule类
概述 CacheModule也是一个Autofac模块. 一.CacheModule类 CacheModule将DefaultCacheManager注册为ICacheManager: ...
随机推荐
- java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...
- 18 BufferedReader使用方法
生成BufferedReader对象的方法: BufferedReader in=new BufferedReader(new FileReader("foo.in")); imp ...
- 14 接口-interface的定义与实现
接口的基本语法一: 1.使用interface 定义 2.接口当中的方法都是抽象方法 3.接口当中的方法都是public权限 接口的定义: interface USB { public void re ...
- extract()函数
extract(),它的主要作用是将数组展开,键名作为变量名,元素值为变量值 extract($_POST);//相当于$username = $_POST['username'];//$passwo ...
- html5标签figure、figcaption
figure.figcaption,这俩个标签都是定义图文的 常常用到一种图片列表,图片+标题或者图片+标题+简单描述.以前的常规写法: <li> <img src="te ...
- smtplib.SMTPDataError: (554, 'DT:SPM 126 smtp5错误解决办法
1.自动化测试中,调用邮件模块自动发送邮件时,运行脚本报错: smtplib.SMTPDataError: (554, 'DT:SPM 126 smtp5,jtKowAD3MJz2c1JXLcK2AA ...
- 【poj1741】 Tree
http://poj.org/problem?id=1741 (题目链接) 题意 给出一个n个节点的带权树,求树上距离不超过K的所有点对的个数. solution 点分治裸题.所谓的点分治,就是对于 ...
- codeforces 342E :Xenia and Tree
Description Xenia the programmer has a tree consisting of n nodes. We will consider the tree nodes i ...
- shell命令bc
简介 bc支持浮点数的精度运算(Bash不支持浮点数运算) 运行方式 一.CLI 二.PIPE 示例 一.浮点数运算 变量scale:设置小数点后面的位数 # 默认scale=0 echo &quo ...
- C#12种顺序排序
这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数R ...