一 asp.net 事件模型机制

-----------------------一

客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行,然后把Html流返回给浏览器

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

二页面事件

2.1 页面事件的执行顺序

Page_Init:初始化值或连接

Page_Load:主要使用IsPostBack,该事件主要执行一系列得操作来首次创建asp.net页面或响应

由投递引起得客户端事件。在此事件之前,已还原页面和控件视图状态。

Page_DataBind: 在页面级别上调用,也可在单个控件中调用。

DataBind_PreRender:数据绑定预呈现,恰好在保存视图状态和呈现控件之前激发此事件。

Page_Unload:此事件是执行最终清理工作的。

非确定事件

Page_Error:如果在页面处理过程中出现未处理的例外,则激发error事件。

Page_AbortTransaction:交易事件,事务处理中如果已终止交易,则激发此事件,购物车常用。

Page_CommitTransaction: 如果已成功交易,则激发此事件。

2.2 Global.asax 中的事件(执行顺序)

Application_Start:应用程序启动时激发

Application_BeginRquest:http请求开始时激发

Application_AuthenticateRequest:  应用程序批准http请求时激发

Session_Start:会话启动时激发

Application_EndRequest:Htttp请求结束时激发

Session_End:会话结束时激发

Application_End:应用程序结束时激发

Application_Error:发生错误时激发

三 ISAPI功能

ISAPI有两大功能:

1: 扩展——win32的动态链接库,譬如aspnet_isapi.dll,可以把ISAPI扩展看作是一个普通的应用程序,它处理的目标是HTTP请求;

2: 过滤器——web服务器把请求传递给相关的过滤器,接下来过滤器可能修改请求,执行某些操作等等

具体言之,IIS本身是不支持动态页面的,也就是说他仅仅支持静态HTML页面的内容,对于.asp| .aspx| .cgi| .php等,IIS并不知道如果处理这些后缀标记,它就会把它当作文本,丝毫不做处理发送到客户端。为了解决这个问题,IIS有一种机制,叫做ISAPI的过滤器。它是一个COM组件。过滤器通过在IIS中配置应用程序扩展名来完成配置。

当IIS安装以后,默认的应用程序配置包含.asp、.aspx、.java、.css、.ascx等等常规扩展名。.asp扩展名对应的ISAPI是asp.dll,.aspx扩展名对应的ISAPI是aspnet_isapi.dll。这样当IIS接收到后缀名为.aspx的请求时,自己无法处理该请求,便读取ISAPI应用程序配置,寻找与.aspx对应的dll,即aspnet_isapi.dll,然后aspnet_isapi.dll进程开始处理代码,生成标准的HTML代码,生成后把这些代码加入到原有的HTML中,最后把完整的HTML返回给IIS,IIS再把内容发送到客户端。

四 ASP.NET请求的处理过程

基于管道模型,在模型中ASP.NET把http请求传递给管道中所有的HTTP模块(即:httpmodule)。每个模块都接收HTTP请求,并有完全的控制权。一旦请求经过了所有的HTTP模块,最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过模块管道中的HTTP模块。

五 ASPNET_ISAPI.DLL实现IIS过滤和扩展的方式

Aspnet_isapi.dll通过HttpModule(即管道模型中的HTTP模块)实现IIS过滤,通过HttpHandler(即HTTP处理程序)实现IIS扩展。

Http模块(HttpModule)实现了过滤器 (ISAPI filter)的功能,它在某些事件中注册,将自己插入到ASP.NET请求处理管道,从而能够对某些事件进行处理,最常用的事件有void Init(HttpApplication application)和void Dispose()等。该模块是实现了System.Web.IHttpModule接口的.net组件。我们可以自定义类继承System.Web.IHttpModule接口,并方法Init(HttpApplication application)来处理请求。

HTTP处理程序(HttpHandler)实现了扩展(ISAPI Extention)的功能,它处理请求(Request)的信息和发送响应(Response),最常用的事件有void ProcessRequest(HttpContext context)和属性bool IsReusable。HTTP处理程序是实现System.Web.IHttpHandler接口的.NET组件。我们可以自定义类继承System.Web.IHttpHandler接口,并实现ProcessRequest(HttpContext context)方法和实现IsReusable属性,来处理请求信息并生成HTML内容

六 ASP.NET的HTTP请求处理流程

当客户端向web服务器请求一个*.aspx的页面文件时,这个http请求会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL,而 ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。

当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:

HttpModule --> HttpHandler Factory --> HttpHandler

当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。

完整的http请求在asp.net framework中的处理流程:

HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->

ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory--> HttpApplication-->

HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

七在应用程序中实现IHttpModule接口

如果想在中途截获一个 httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的

7.1 ASP.NET系统中默认的HttpModule

系统本身的HttpModule实现一个IHttpModule的接口,当然我们自己的类也能够实现IHttpModule接口,这就可以替代系统的 HttpModule对象了

ASP.NET系统中默认的HttpModule:

DefaultAuthenticationModule  确保上下文中存在 Authentication 对象。无法继承此类。

FileAuthorizationModule  验证远程用户是否具有访问所请求文件的 NT权限。无法继承此类。

FormsAuthenticationModule 启用 ASP.NET应用程序以使用 Forms身份验证。无法继承此类。

PassportAuthenticationModule  提供环绕 PassportAuthentication 服务的包装。无法继承此类。

SessionStateModule   为应用程序提供会话状态服务。

UrlAuthorizationModule   提供基于 URL的授权服务以允许或拒绝对指定资源的访问。无法继承此类。

WindowsAuthenticationModule  启用 ASP.NET 应用程序以使用 Windows/IIS身份验证。无法继承此类

7.2 在我们的web应用程序中实现IHttpModule接口

这些系统默认的HttpModule是在文件 machine.config中配置的,和我们开发时使用到的web.config的关系是:是在ASP.NET FRAMEWORK启动处理一个Http Request的时候,它会依次加载machine.config和请求页面所在目录的web.config文件,如果在machine中配置了一个自己的HttpModule,你仍然可以在所在页面的web.config文件中添加自己的HttpModule,方法如下:

首先自定义类实现IHttpModule接口:

public class HelloWorldModule : IHttpModule

{

public HelloWorldModule()

{

}

public String ModuleName

{

get { return "HelloWorldModule"; }

}

// In the Init function, register for HttpApplication

// events by adding your handlers.

public void Init(HttpApplication application)

{

application.BeginRequest +=

(new EventHandler(this.Application_BeginRequest));

application.EndRequest +=

(new EventHandler(this.Application_EndRequest));

}

private void Application_BeginRequest(Object source,

EventArgs e)

{

// Create HttpApplication and HttpContext objects to access

// request and response properties.

HttpApplication application = (HttpApplication)source;

HttpContext context = application.Context;

context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");

}

private void Application_EndRequest(Object source, EventArgs e)

{

HttpApplication application = (HttpApplication)source;

HttpContext context = application.Context;

context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");

}

public void Dispose()

{

}

}

其次在web.config中的根目录<configuration></configuration>中添加如下配置:

<system.web>

<httpModules>

<add name="HelloWorldModule" type="namespace.HelloWorldModule, AssemblyName"/>

</httpModules>

</system.web>

这里的name属性值自定义,而type属性值则包含两个信息:namespace.HelloWorldModule, AssemblyNam,前者是命名空间.类名,后者是该类所在项目工程中AssemblyInfo.cs文件中所定义的AssemblyTitle属性值。

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

八深入HttpModule与HttpHandler

一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在 hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给 HttpModule

上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括 BeginRequest, EndRequest,AuthentiacteRequest 等等。

九 IHttpHandler

它是asp.net Framework提供的一个接口,定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定。也就是说,如果你想要自行处理某些类型的 HTTP请求信息流的话,你需要实现这些系统约定才能做到。譬如一个*.aspx文件,用来处理此类型的Http请求,ASP.NET FRAMEWORK将会交给一个名为System.Web.UI.PageHandlerFactory的HttpHandler类来处理。

HH 和HM一样,系统会在最初始由ASP.NET FRAMEWORK首先加载machine.config中的HttpHandler,而后会加载Web应用程序所在目录的web.config中的用户自定义的HttpHandler类。但是系统与我们自定义的HH之间的关系是"覆盖"的,也就是说如果我们自定义了一个针对"*.aspx"的 HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理,而我们自己的 HttpHandler类则需要自己完全解析这个Http请求,并作出处理。

IHttpHandler接口中最重要的方法 ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到 HttpHandler容器中的时候,framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。

framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的,而是定位到了其内部默认的IHttpHandler Factory上了。IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率

asp.net架构之请求处理过程:HttpModule,HttpHandler相关推荐

  1. Asp.net的HTTP请求处理过程

    说明: (1).客户端浏览器向服务器发出一个Http请求,此请求会被inetinfo.exe进程截获,然后转交给 aspnet_isapi.dll进程,接着它又通过Http Pipeline的管道,传 ...

  2. ASP.NET的(HttpModule,HttpHandler)

    在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请求转交给asp.dll进程 ...

  3. IIS5、IIS6、IIS7的ASP.net 请求处理过程比较

    IIS5.IIS6.IIS7的ASP.net 请求处理过程比较  这篇文章是收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP ...

  4. IIS5IIS6IIS7的ASP.net 请求处理过程比较(转)

    http://www.sina.com.cn 2008年07月30日 16:04 <程序员> ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来 ...

  5. IIS5、IIS6、IIS7的ASP.net 请求处理过程比较转

    http://blog.csdn.net/dz45693/archive/2009/12/17/5027882.aspx ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力 ...

  6. IIS 相关概念(站点、虚拟目录、应用程序池、隔离模式、W3WP.EXE、Web Gargen) 及 IIS 6的ASP.net请求处理过程

    基本概念: 1. 站点程序:在IIS中我们所新建的站点,可以为其配置ASP.net以及应用程序池的版本. 2. 虚拟目录:用来将不同的文件夹中的内容通过虚拟目录组织到同一个文件夹中,相当于一个应用程序 ...

  7. ASP.NET架构分析

    最近听了微软讲师邵志东的讲座"深入解析ASP.NET架构"的视频讲座,我觉得对ASP.NET架构有一定的认识,现在对讲座做一点总结,以及发表我对ASP.NET架构相关知识的自身理解 ...

  8. 转载--【笔记】Asp.Net构架(Http请求处理流程)

    转载--[笔记]Asp.Net构架(Http请求处理流程) 最近接触了一些Asp.Net开发人员,在聊到技术的时候,发现很多的Asp.Net开发人员都不明白在ASP.NET中一个页面请求的处理流程,今 ...

  9. HttpModule,HttpHandler 简介

    一 asp.net请求的处理过程 ------------------- HttpModule 必须要掌握的东西 HttpHandler 必须要掌握的东西,非常有用 以上两个的实例 --------- ...

最新文章

  1. 年薪25-50w| 虚拟现实创新中心三维重建算法高级研究员招聘
  2. RSA大会播报 – 2014最佳安全博客提名
  3. python querystring encode_Java UriUtils.encodeQueryParam方法代碼示例
  4. (五)Vue 面试真题演练
  5. 《MySQL——查询长时间不返回的三种原因与查询慢的原因》
  6. SQL Server有这些属性吗
  7. datagridview取消默认选中_winform datagridview中的 combobox如何选中默认值?
  8. Python 3.5/3.6 windows 7 安装
  9. web前端基础之Bootstrap(三) - 插件
  10. KNN(二)--近似最近邻算法ANN
  11. 计算机网络课程主机号怎么看,已知Ip地址_子网掩码如何计算子网号、主机号(收集整理)...
  12. SQL(16)--获取员工当前薪水比其manager薪水还高的相关信息
  13. 用户画像如何分析 用户画像如何获取
  14. 《把时间当作朋友》第1章读后感(一)
  15. 启动ps时,老是出现一个提示框:不能输入剪贴板,因为意外遇到文件尾
  16. android编译集成dialer应用,Comet Android Dialer
  17. 企业实现统一身份认证的作用和好处有哪些?(图文并茂)
  18. 移动互联网——2011年最值得关注的100个应用程序(目录)
  19. 豆丁文档下载器再也不用苦于没有积分不能下载而发愁了
  20. 计算机毕业设计基于asp.net企业合同管理系统

热门文章

  1. 《产品设计与开发(原书第5版)》——3.8 步骤5:选出最佳机会方案
  2. java操作redis redis连接池
  3. 查看nginx php mysql apache编译安装参数
  4. Android深入浅出系列之实例应用—弹出消息Toast对象的使用纯文本方式(一)
  5. 微服务系列 —— 一小时搞定Eureka
  6. 如何在Ubuntu 18.04上创建多节点MySQL集群
  7. SpringBoot之创建SpringBoot项目(idea开发)
  8. 【C#学习之旅】一、数据类型
  9. 【Nginx那些事】nginx配置实例(一)反向代理
  10. C#LeetCode刷题之#263-丑数(Ugly Number)