本文By 杨工.

一、 Http.sys

http.sys 从Win2003和WinXP SP2开始,就成为windows操作系统内核驱动程序,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。

如果用户不慎删除了该驱动文件,该驱动会在下次系统启动时重建。是一个删除不掉的系统核心组件,手动结束该驱动,该驱动也会马上重新创建(只有粉碎文件才不能马上重建,但粉碎后,下次启动会重建)。

新的Http.sys带来的好处大致有如下一些:

1. 缓存 - 静态的内容现在被缓存于内核模式下,这使服务响应速度更快

2. 记录 (Log)-IIS的log功能更快且标准化了

3. 带宽控制 -更大的可伸缩性的控制和调节

4. 可靠性 - 所有的服务请求会在Http.sys里暂存入队列,而不是由服务程序本身来处理,这样,即使WEB服务程序重启,尚未被处理的请求也不会丢失了

5. IP端口重用 -只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了。

Http.sys 是IIS 6.0使用的新型侦听器。在IIS 6.0出现之前,inetinfo.exe完成侦听HTTP请求的功能,同时还要将请求转发给对应的处理程序。从IIS 6.0开始,侦听器与inetinfo.exe分离开来,inetinfo.exe在用户模式下运行,Http.sys则完成侦听HTTP请求的功能,在 内核模式下运行。

 

二、 IIS的生命周期

1、HttpApplication 对象分配给请求

2、集成处理管道

 

三、HttpModule

1、HttpModule是实现了System.Web.IhttpModule接口的类。

IHttpModule接口的声明:

public interface IHttpModule

{

void Init (HttpApplication context);

void Dispose ();

}

Init 方法:系统初始化的时候自动调用,这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。

Dispose方法: 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。此方法一般无需编写代码。

2、事件

HTTP模块可以向System.Web.HttpApplication对象注册下面一系列事件:

AcquireRequestState 当ASP.NET运行时准备好接收当前HTTP请求的对话状态的时候引发这个事件。

AuthenticateRequest 当ASP.NET 运行时准备验证用户身份的时候引发这个事件。

AuthorizeRequest 当ASP.NET运行时准备授权用户访问资源的时候引发这个事件。

BeginRequest 当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件。

Disposed 当ASP.NET完成HTTP请求的处理过程时引发这个事件。

EndRequest 把响应内容发送到客户端之前引发这个事件。

Error 在处理HTTP请求的过程中出现未处理异常的时候引发这个事件。

PostRequestHandlerExecute 在HTTP处理程序结束执行的时候引发这个事件。

PreRequestHandlerExecute 在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序。

PreSendRequestContent 在ASP.NET把响应内容发送到客户端之前引发这个事件。这个事件允许我们在内容到达客户端之前改变响应内容。我们可以使用这个事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息或脚信息。

PreSendRequestHeaders 在ASP.NET把HTTP响应头信息发送给客户端之前引发这个事件。在头信息到达客户端之前,这个事件允许我们改变它的内容。我们可以使用这个事件在头信息中添加cookie和自定义数据。

ReleaseRequestState 当ASP.NET结束所搜有的请求处理程序执行的时候引发这个事件。

ResolveRequestCache 我们引发这个事

件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的。

UpdateRequestCache 当ASP.NET完成了当前的HTTP请求的处理,并且输出内容已经准备好添加给输出缓冲的时候,引发这个事件。这依赖于Web应用程序的输出缓冲是如何设置的。

 

四、 HttpHandler

HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。

参见:

http://msdn.microsoft.com/zh-cn/library/ms178472%28v=vs.100%29.aspx

另外,网上还有很多写的好的文章,两个传送门:

《HttpModule与HttpHandler详解》
http://www.cnblogs.com/yuanyuan/archive/2010/11/15/1877709.html

《HttpHandler HttpModule入门篇》 (针对ASP.NET 2.0 内容依然适用)
http://www.cnblogs.com/cyan/archive/2009/02/04/1383580.html

002. Asp.Net Routing与MVC 之(基础知识):HttpModule 与 HttpHandler的更多相关文章

  1. 003. Asp.Net Routing与MVC 之一: 请求如何到达MVC

    基础知识 本文用到的基础知识:URL.HttpModule 与 HttpHandler.IIS 的请求处理过程. URL HttpModule与HttpHandler IIS7.0的请求处理过程 OK ...

  2. 005. Asp.Net Routing与MVC 之三: 路由在MVC的使用

    上次讲到请求如何激活Controller和Action,这次讲下MVC中路由的使用.本次两个关注点: 遗留:ModelBinder.BindModel的过程 MVC中路由的使用 MVC 5中的Acti ...

  3. 001. Asp.Net Routing与MVC 之(基础知识):URL

    URL(Uniform Resoure Locator:统一资源定位器)是WWW页的绝对地址.URL地址格式排列为:scheme://host:port/path. 例如 http://www.zn. ...

  4. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action

    上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...

  5. .Net MVC 框架基础知识

    一.什么是MVC? MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式. MVC全名是Model View Controlle ...

  6. spring笔记4 spring MVC的基础知识4

    //todo 5,spring MVC的本地化解析,文件上传,静态资源处理,拦截器,异常处理等 spring MVC 默认使用AcceptHeaderLocalResolver,根据报文头的Accep ...

  7. spring笔记3 spring MVC的基础知识3

    4,spring MVC的视图 Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果. 视图:view接口,来个源码查看:它由视图解析器实例化,是无状态的,所 ...

  8. spring笔记2 spring MVC的基础知识2

    2,spring MVC的注解驱动控制器,rest风格的支持 作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器: @RequestMapping处理用户的请求,下面 ...

  9. spring笔记1 spring MVC的基础知识1

    1,spring MVC的流程 优秀的展现层框架-Spring MVC,它最出彩的地方是注解驱动和支持REST风格的url.   流程编号 完成的主要任务 补充 1 用户访问web页面,发送一个htt ...

随机推荐

  1. 100-days: seventeen

    Title: How 'Bohemian Rhapsody(波西米亚狂想曲)' ended up in 'Wayne's World(反斗智多星)' and became a phenomenon(现 ...

  2. TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)

    描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the b ...

  3. 信号基础知识----线性调频信号LFM //matlab命令:chirp

    %关于线性调频信号(LFM) %参考书目:声呐技术,第二章P33 clc;close all;clear all;%参数----------------------------------f0=100 ...

  4. Selenium 笔记

    1. 截屏:get_screenshot_as_file(“C:\\b1.jpg”) 2. 退出:(1).close----关闭当前窗口 (2).quit()-----用于结束进程,关闭所有的窗口 一 ...

  5. vue-router 动态添加 路由

    动态添加路由可以用了做权限管理.登录后服务器端返回权限菜单,前端动态添加路由  然后在设置菜单 1.vue-router 有方法router.addRoutes(routes) 动态添加更多的路由规则 ...

  6. (转)Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入

    文章转自:http://blog.csdn.net/qq_30379689/article/details/52494270 Activity跳转动画.淡入淡出.滑入滑出.自定义退出进入 前言: 系统 ...

  7. python 常用标准库

    标准库和第三方库第一手资料: 在线: 官方文档(https://docs.python.org/) 离线:交互式解释器(dir().help()函数),IPython(tab键提示.?.??) 一.  ...

  8. idea配置网络代理

    背景 公司限制连接外网,很多软件都被限制了,包括idea,只能通过代理上网. 使用代理上网,以往都是在IE的工具-Internet选项-连接里进行设置就OK了,谷歌浏览器啥的就可以上网了.但intel ...

  9. win10自带输入法的标点符号切换

    快捷键是ctrl+句号 然后开启设置,把中文也用英文标点也选上.

  10. Java多线程系列2 线程常见方法介绍

    守护线程 执行一些非业务方法,比如gc.当全部都是守护线程的时候,jvm退出 线程优先级  设置线程优先级:setPriority(int priorityLevel).参数priorityLevel ...