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: ...
随机推荐
- mtd零星记录
查看Flash分区情况: root@DD-WRT:~# cat /proc/mtd dev: size erasesize name mtd0: "RedBoot" mtd1: 0 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段
该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能: ping一个网段内的IP,检测哪 ...
- HTTP,TCP/IP协议
本文转自cnblogs:http://www.cnblogs.com/xhwy/archive/2012/03/03/2378293.html 一.概述 1.1 TCP HTTP UDP: 都 ...
- JAVA 自定义状态码
返回信息类(ResponseInfo): public class ResponseInfo { public static final String Status = "status&qu ...
- Objective-C学习笔记之NSData、NSDate
NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛.NSData创建后不可以再修改,NSMutableData可以再次修 NSString *s ...
- asp.net与Matlab类型转换(待补全)
上上篇的博客已经提到如何配置环境,即如何在asp.net中调用matlab生成的dll文件.这篇博客打算做个笔记,那就是matlab和C#数据类型如何转换.随着需求的增加,我会不断增加新的类型转换. ...
- C#中字符串的操作
1.Replace(替换字符):public string Replace(char oldChar,char newChar);在对象中寻找oldChar,如果寻找到,就用newChar将oldCh ...
- windows 修改hosts 脚本
@echo off echo "请注意你的杀毒软件提示,一定要允许" echo. & pause @del C:\Windows\System32\drivers\etc\ ...
- Java实例分析:宠物商店
设计一个“宠物商店”,在宠物商店中可以有多种宠物,试表示出此种关系,并要求可以根据宠物的关键字查找相应的宠物信息. //======================================== ...