MVC系列(4) Http Pipeline详细分析(上)

继续上一章节的内容,通过HttpApplicationFactory的GetApplicationInstance静态方法获取实例,然后执行该实例的BeginProcessRequest方法进行执行余下的Http Pipeline 操作,代码如下:

// Get application instance
IHttpHandler app = HttpApplicationFactory.GetApplicationInstance(context);

那GetApplicationInstance这个方法究竟做了啥呢?难道只是new一个新对象出来?感觉应该不像,那我们就来看看HttpApplicationFactory类的GetApplicationInstance静态方法源码:

internal static IHttpHandler GetApplicationInstance(HttpContext context) {
    if (_customApplication != null)
        return _customApplication;   

    // Check to see if it's a debug auto-attach request
    if (context.Request.IsDebuggingRequest)
        return new HttpDebugHandler();  

    _theApplicationFactory.EnsureInited();  

    _theApplicationFactory.EnsureAppStartCalled(context);  

    return _theApplicationFactory.GetNormalApplicationInstance(context);
}

里面有3行代码我已经标记为粗体了,在解释每行代码的具体作用之前,先看看_theApplicationFactory对象实例从哪里来,通过查看该字段的声明代码可以看到它是单例的实现。

// the only instance of application factory
private static HttpApplicationFactory _theApplicationFactory = new HttpApplicationFactory();

第一行粗体代码是执行,该实例的EnsureInited方法,这个方法会通过lock的方式调用Init方法(好处自然不用多说了吧),代码如下:

private void EnsureInited() {
    if (!_inited) {
        lock (this) {
            if (!_inited) {
                Init();
                _inited = true;
            }
        }
    }
}

通过查找 Init方法的代码以及其中2行如下代码里的细节,我们可以得知,这2行代码主要是从global.asax获取内容,然后进行编译。

_appFilename = GetApplicationFile();
CompileApplication();

所以,HttpApplicationFactory._theApplicationFactory.EnsureInited()  的方法首先检查HttpApplicationFactory是否被初始化,如果没有,就通过HttpApplicationFactory.Init()进行初始化。在Init()中,先获取global.asax文件的完整路径,然后调用CompileApplication()对global.asax进行编译。

第2行粗体的EnsureAppStartCalled方法,最终会调用如下的私有方法FireApplicationOnStart,代码如下:

private void FireApplicationOnStart(HttpContext context) {
    if (_onStartMethod != null) {
        HttpApplication app = GetSpecialApplicationInstance();  

        app.ProcessSpecialRequest(
                                    context,
                                    _onStartMethod,
                                    _onStartParamCount,
                                    this,
                                    EventArgs.Empty,
                                    null);   

        RecycleSpecialApplicationInstance(app);
    }
}

通过代码我们能够得知 HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context)   创建特定的HttpApplication实例,触发ApplicationOnStart事件,执行ASP.global_asax中的 Application_Start(object sender, EventArgs e)方法。然后在处理完事件以后就立即被回收掉,因为系统初始化只需要一次,但是其中的GetSpecialApplicationInstance里会对IIS7做一些特殊的事情,我们后面的章节会讲到。

第3行的粗体代码是我们这里要说的重点,它方法里的代码如下:

private HttpApplication GetNormalApplicationInstance(HttpContext context) {
    HttpApplication app = null;   

    lock (_freeList) {
        if (_numFreeAppInstances > 0) {
            app = (HttpApplication)_freeList.Pop();
            _numFreeAppInstances--;  

            if (_numFreeAppInstances < _minFreeAppInstances) {
                _minFreeAppInstances = _numFreeAppInstances;
            }
        }
    }  

    if (app == null) {
        // If ran out of instances, create a new one
        app = (HttpApplication)HttpRuntime.CreateNonPublicInstance(_theApplicationType);   

        using (new ApplicationImpersonationContext()) {
            app.InitInternal(context, _state, _eventHandlerMethods);
        }
    }  

    return app;
}

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/aspx/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索app
, 实例
, 方法
, context
, 代码
HttpApplication
springmvc详细教程、spring mvc详细讲解、spring mvc 详细注解、spring mvc 详细配置、springmvc超详细教程,以便于您获取更多的相关知识。

时间: 2024-10-01 13:37:22

MVC系列(4) Http Pipeline详细分析(上)的相关文章

MVC系列(5) Http Pipeline详细分析(下)

接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件,比如如下代码: public class Test : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); context.AuthenticateReques

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    (5):前台Jquery easyUI实现    (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一     (9)

MVC系列(8) UrlRouting的理解

根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHandler,并且通过这个 HttpHandler的BeginProcessRequest(或ProcessRequest)来处理并返回请求,前面的章节将到了再 MapHttpHandler这个周期将会根据请求的URL来查询对应的HttpHandler,那么它是如何查找的呢? 一起我们在做自定义HttpHandler的时候,需要执行URL以及

自定义View系列教程04--Draw源码分析及其实践

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类--LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL

十种流行进程注入技术详细分析

本文讲的是十种流行进程注入技术详细分析, 前言 流程注入是一种恶意软件和无文件间谍攻击中使用的最为广泛的漏洞攻击技术,而且在攻击时还需要在另一个进程的地址空间内运行自定义代码.过程注入除了提高了攻击的隐蔽性之外,也实现了持久性攻击.尽管目前有许多流程注入技术,但在本文中,我只介绍十种在野外看到的能够运用另一个进程运行恶意代码的技术.在介绍的同时,我还会提供这些技术的屏幕截图,以便于逆向工程和恶意软件分析,协助针对这些常见技术进行的检测和防御. 一.经典的DLL注入 这种技术是用于将恶意软件注入另

编程c语言-这个程序详细分析~~~求大神

问题描述 这个程序详细分析~~~求大神 看了半天弄不清 解决方案 这是一个函数递归调用的例题,首先n=5,调用age函数,此时n!=1,所以直接执行else语句,t=age(4)+2,(age(4)的值等于age(3)+2)n=4>1,第二次调用age函数,再次执行else语句,返回的是t=age(3)+2,(age(2)+2)以此类推,当第五次调用age函数时,n==1,所以第五次返回的是10,所以最终的结果是10+2+2+2+2=18. 解决方案二: 总共有4层递归,最深的一层递归时n=1,

powercat工具详细分析

本文讲的是powercat工具详细分析,这个工具出来两年了,但是好像很少人知道他.国外的大牛们用的比较多,国内的文章出现powercat关键字的寥寥无几,更别说有这款工具的详细用法了. 0x01  powercat简介 是NetCat 的Powershell 版本.作者的介绍也是这样写的,但是我觉得,powercat不管怎么样,也有比NetCat 强的一点,就是没有任何痕迹!来无影去无踪.关掉powershell 我们还是好朋友. 0x02 下载运行 直接克隆回本地: git clone htt

Linux内核OOM机制的详细分析(转)

Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典型的情况是:某天一台机器突然ssh远程登录不了,但能ping通,说明不是网络的故障,原因是sshd进程被 OOM killer杀掉了(多次遇到这样的假死状况).重启机器后查看系统日志/var/log/messages会发现 Out of Memory: Kill process 1865(sshd)