原文:http://www.cnblogs.com/wupeiqi/archive/2013/03/03/2941295.html

工作进程:

在iis中,工作进程(w3wp.exe)运行着asp.net应用程序,管理并响应所有的请求,asp.net所有的功能都运行在工作进程下,当请求到来时,工作进程会生成request和response相关信息。

应用程序池:

应用程序池是工作进程的容器。通常用来隔开不同配置的工作进程,当一个程序出错或进程资源回收的时,其他池中的程序不受影响。

注:当一个应用程序池包含多个工作进程时,叫做web garden

如果我们看看iis 6 的结构,就会发现可以把他分为两部分

   内核模块(kernel model)

   用户模块(user model)

内核模式是从iis 6.0被引入的,他包含一个叫做http.sys的文件,每当请求到来时,会首先触发该文件的响应。

http.sys负责将请求传入到相应的应用程序池,但是http.sys是如何知道应该传到那个应用程序池?当然不是随机的,每当创建一个应用程序池,该池的ID就会生成并在http.sys文件中注册,因此该文件就能确定将请求发往那个程序池。

以上便是IIS处理请求的第一步。接着,我们来看一下请求如何从HTTP.SYS传入应用程序池。

在iis用户模块(user model),通过WAS(web admin services)从http.sys接收请求,并传入应用程序池。

当应用程序池接收到请求之后,会传给工作进程(w3wp.exe),该进程检查请求的URL后缀,以确定加载那个ISAPI 扩展,然后将该请求传递给合适的 ISAPI 扩展。

ASP.NET 处理已映射到它上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。

即:当文件为上述后缀时,就要加载ASP.NET的ISAPI扩展(aspnet_isapi.dll)

一旦工作进程加载了aspnet_isapi.dll,就会构造一个HttpRuntime类(密封类,防止派生),该类是应用程序的入口,通过该类中的ProcessRequest()方法创建HttpContext类,进入ProcessRequest方法之后,内部触发一系列的方法,最终创建一个HttpContext实例(可通过HttpContext.Current获取到这个实例),且该实例会在整个生命周期内存活。 

之后HttpRuntime类会向HttpApplicationFactory类 提出请求,要求返回一个HttpApplication对象,HttpApplicationFactory在收到请求之后会检查是否有已经存在并且空闲的对象,如果有就取出一个HttpApplication对象返回给HttpRuntime类,如果没有,则要创建一个给HttpRuntime。

HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context) 该方法创建HttpApplication实例并进行初始化,调用System.Web.HttpApplication.InitInternal()方法。

当每次请求到来时要穿过httpModule到达httphandler,以便被响应。而httpmodule就被配置在httpApplication中。

创建HttpApplication实例之后就是调用实例的InitInternal方法。

InitInternal方法的主要功能如下:

  1、HttpAplication对象被初始化时,首先调用InitModule方法来加载Web.config文件中配置的所有HttpModule模块。

例如:

//Web.Config文件中
<System.web>
<httpModules>
<add name="MyModuleName" type="MyModule">
</httpModules>
</System.web> //自定义一个类(类型) public class MyModule:IHttpModule
{
public MyModule()
{
//
// TODO: 在此处添加构造函数逻辑
//
} #region IHttpModule 成员 public void Dispose()
{ } public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(Mycontext_BeginRequest);
} private void Mycontext_BeginRequest(object sender, EventArgs e)
{
//具体操作
HttpContext.Current.Response.Write("BeginRequest11111111111111</br>"+dt);
}
#endregion
}

2、接着HookEventHandlesForApplicationAndModules方法被调用,这个方法完成Global.asax文件中配置的HttpModule或HttpApplication的绑定

例如:

//Global.asax文件
void MyModule_ExposedEvent(object sender, EventArgs e)
{
Response.Write("xixi");
}
//MyModule.cs文件
public class MyModule:IHttpModule
{
public event EventHandler ExposedEvent;//HttpModule事件,供Global.asax来订阅 public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);//订阅HttpApplication的事件
} void context_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write("BeginRequest");
OnExposedEvent(new EventArgs());//触发HttpModule自定义事件
} protected void OnExposedEvent(EventArgs e)
{
if (ExposedEvent != null)
{
ExposedEvent(this, e);
}
} public void Dispose()
{
}
}
上面的MyModule_ExposedEvent方法就会自动订阅了MyModule中的ExposedEvent事件。

3、最后ApplicationStepManage对象的BuildSteps方法被调用,完成HttpApplication事件的绑定。

4、按照顺序执行HttpApplication的各个事件。即:之前注册的对请求加以处理或者检查的HttpModule模块内容也得以执行。

在这些事件中,第10个事件【根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理】,这个事件也是HttpHandler创建的地方。

-----------------------------------------------------------------

前面我们一直在说ASP.NET管线,那么,谁在控制管线过程?
答案是:HttpApplication对象。
1. HttpApplication细分它的处理过程,在不同阶段引发不同的事件,使得HttpModule通过订阅事件的方式加入到请求的处理过程中。
2. 在请求的处理过程中,HttpApplication对象主要扮演着控制处理流程的推进作用。
3. HttpApplication会在固定的阶段获取一个IHttpHandler实例,然后将请求的响应过程交给具体的IHttpHandler来实现。

HttpApplication如何产生,如何工作?
1. HttpApplication对象会被重用,当HttpRuntime不能从HttpApplicationFactory获取空闲的实例时,才会创建。
2. HttpRuntime会将每个请求交给一个HttpApplication对象来处理。
3. HttpApplication对象在初始化时负责加载全部的HttpModule。
4. 每个HttpApplication对象会控制属于它的管线过程。

HttpApplication是个非常重要的类型,它的许多功能都属于框架的基础部分,不需要我们调用, 因此,我们平时不会用到它。

-------------------------------------------------------------------------

HttpHandler根据用户请求的文件的扩展名(.aspx、.ascx、.ashx 、 .asmx)处理请求。

HttpApplication在将某个请求交给HttpHandler实例来处理时,是通过接口来调用某个合适HttpHandler类中ProcessRequest方法,来处理请求。

例如:自己定义个处理请求的HttpHandler。 (其实HttpHandler是只实现了IHttpHandler接口的类总称)

//Web.Config文件中
<httpHandlers>
<add path="*.aspx" verb="*" type="SearchInfo.Handle"/>
<add path="*.ascx" verb="*" type="SearchInfo.Handle2"/>
</httpHandlers>
//SearchInfo是命名空间,Handle是自己定义处理请求的类。
//即:当一个请求Url后缀是 .aspx 时,就会交给自定的Handle类去处理 namespace SearchInfo
{
/// <summary>
/// Handle 的摘要说明
/// </summary>
public class Handle:IHttpHandler
{
public Handle()
{
//
// TODO: 在此处添加构造函数逻辑
//
} #region IHttpHandler 成员 public bool IsReusable
{
get { throw new Exception("The method or operation is not implemented."); }
} public void ProcessRequest(HttpContext context)
{
HttpContext.Current.Response.Write("自定义Handler处理请求aspx");
} #endregion
}
}

所以,我们应该这样理解HttpHanlder:一个HttpHanlder用于响应一类特定的请求。

在请求的处理过程中,HttpApplication对象主要扮演着控制管线处理流程的作用,它负责推进整个处理流程, 除了在不同阶段引发不同的事件外(供HttpModule使用),HttpApplication对象还会根据当前请求寻找一个合适的IHttpApplicationFactory实例, 并最终得到一个IHttpHandler的实例用于处理请求。

当每次请求到来时要穿过httpModule到达httphandler,以便被响应。而httpmodule就被配置在httpApplication中。

即流程为:

每当请求Web服务器上的某些信息时,该请求首先会到达Http.SYS,然后Http.SYS将其发送到相应的应用程序池,应用程序池传给工作进程并加载ISAPI扩展,然后HttpRuntime对象会被创建,并通过HttpModule和HttpHandler处理请求。

对于详细的HttpHandler和HttpModule可以在 Fish Li 的博客中:

asp.net 处理流程的更多相关文章

  1. 开源的asp.net工作流程引擎。 http://ccflow.org

    开源的asp.net工作流程引擎. http://ccflow.org

  2. ASP.NET MVC流程解说

    开始想这个标题时,,很忧郁什么标题将得到更好的叫什么,最后确定的解释,虽然稍0基金会,但是,这个概念是非常.我想出了一个相当的价格值的. ,開始. 1.MVC的基本开发流程   2.webform和M ...

  3. MVC之前-ASP.NET初始化流程分析1

    Asp.net Mvc是当前使用比较多的web框架,也是比较先进的框架.我打算根据自己的实际项目经验以及相关的源码和一些使用Asp.net Mvc的优秀项目(主要是orchard)来说一说自己对于As ...

  4. ASP.NET初始化流程分析2

    上一篇讲了从创建应用程序域到创建ISAPIRuntime实例的过程,本篇继续讲Asp.net处理第一次请求的必要的初始化过程. ISAPIRuntime分析 ISAPIRuntime在System.W ...

  5. 【源码】进入ASP.NET MVC流程的大门 - UrlRoutingModule

    UrlRoutingModule的功能 在ASP.NET MVC的请求过程中,UrlRoutingModule的作用是拦截当前的请求URL,通过URL来解析出RouteData,为后续的一系列流程提供 ...

  6. asp.net开源流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口二.   接口说明 所谓的驰骋工作流引擎的接口,在B ...

  7. ASP.NET运作流程

    当我们在浏览器输入域名访问服务器资源时,会向服务器发送Http请求,并经由IIS处理后,交由ASP.NET托管程序处理,进入ASP.NET管道.在IIS内部如何处理我们不需要深入去了解,在ASP.NE ...

  8. asp.net请求流程

    http://developer.51cto.com/art/200902/109441.htm http://www.cnblogs.com/couhujia/archive/2010/04/21/ ...

  9. 学习asp.net的流程

    如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP.NE ...

随机推荐

  1. Linux 两个目录浅对比拷贝

    对比两个目录内容,然后拷贝! #!/usr/bin/python# -*-coding:utf-8 -*-import osimport sysimport shutildef get_dir_con ...

  2. salt-ssh安装及简单使用

    需要 salt-master 0.17以上版本支持 1.安装 相关依赖包可查看requirements.txt Jinja2 M2Crypto msgpack-python pycrypto PyYA ...

  3. web开发中,前端javascript代码的组织结构

    网页包含三个层次: 结构(HTML) 表现(CSS) 行为(javascript) web标准中,三者要分离,网页源代码由三部分组成:.html文件..css文件和.js文件.就是说html文件中不应 ...

  4. C#调用C++ Dll

    现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...

  5. AppCan教你从零开始做开发

    经常收到类似这样的提问:新手开发APP,要怎么学?我有满屏幕的文档和视频,然而并没有什么卵用,因为我不知道该从哪看起……今天的主要内容是教大家,如何在AppCan移动平台创建应用,引擎插件选择.证书管 ...

  6. android开发系列之回调函数

    想必对于回调函数大家肯定不陌生,因为这是我们开发里面常用的代码技巧.我也就不废话了,让我们直接来看代码吧! public class TestCallback { public interface I ...

  7. Get 和 Post方法的登录

    1. Get & Post 1> Get请求直接从服务器拿数据 性能好 效率高 在地址栏会显示所有的参数,从直观上安全性不高 由于Get不提交数据给服务器,因此实际的安全性高 实际应用: ...

  8. Your First ASP.NET 5 Application on a Mac

    Your First ASP.NET 5 Application on a Mac By Daniel Roth, Steve Smith, Rick Anderson ASP.NET 5 is cr ...

  9. [原创]flexslider 中文文档 使用教程 参数手册

    要改前人用的flexslider功能,但苦于找不到详细的文档教程,折磨了好久……(所以我才说不爱乱用插件) 为了福利下之后也苦于这个问题的人,我整理总结了下我找到的一些东西.可能没那么完善正确,欢迎在 ...

  10. STM32管教复用与重映射关系

    摘自:http://blog.csdn.net/lincheng15/article/details/51789093 概括一下:复用就是一个引脚有几个功能,1.做普通IO输入输出 2.其他外设的输入 ...