1、简介

大多数情况下,作为一个asp.net web开发对整个web应用程序的控制是十分有限的,我们的控制往往只能做到对应用程序(高层面)的基本控制。但是,很多时候,我们需要能够低级层面进行交互,例如:Web服务器如何处理入站的出站的Http请求,这就需要找到与iis交互的方法!

在Asp.Net推出之前,为了获得IIS这个级别的控制,必须创建和扩展ISAPI扩展或过滤器,但是如果使用这个方法,必须具备C和C++的知识,并需要知道如何创建本机的Win32 Dll,所以为了解决这个问题,ASP.NET提供了处理Http请求的两种方法:HttpMoudle和HttpHandler,这两种方法为ASP.NET的底层处理过程提供了独特的访问级别。

2、处理Http请求

在开始编写模块和处理程序之前,应该先了解IIS和Asp.Net是如何处理入站的Http请求,以及将我们的逻辑插入这些请求时,该用什么选项。IIS是入站HTTP请求的基本端点。从较高层面来看,它的工作是监听和验证入站的Http请求,然后把它们路由到合适的模块进行处理,再把结果返回给最初的请求者,ASP.NET是处理(IIS传送过来的HTTP请求)的模块之一,但是这些请求如何处理,则取决与IIS的版本。

(1)、IIS6和Asp.Net

IIS6将Asp.Net当成了可以处理HTTP请求的独立的模块,而不是将他当成整个IIS请求处理管道的一部分

(3)、IIS7、IIS8和Asp.Net

从IIS7开始,Asp.Net就被集成到了IIS请求处理管道之中,并且允许在管道中集成托管模块

(4)、Asp.Net处理请求

无论使用哪个版本的IIS,基本HTTP请求管道模型都有处理请求的两个核心机制:HttpMoudle和HttpHandler,Asp.Net使用这两个机制来处理入站Http请求,生成响应,并返回给客户端。

从上图可以看出,Asp.Net允许在管道中存在有多个模块以处理不同的请求,在入站请求通过各个模块后,就传送给HttpHandler,他负责处理请求。

注:尽管一个请求需要通过许多不同的模块,但只能由一个处理程序来处理,该处理程序负责给入站的Http请求创建响应,在处理程序执行完毕并生成响应后,就通过一系列后期模块将响应返回给客户端。

(5)、HttpMoudle

HttpMoudle是一些很简单的类,可以把它们插入到请求处理管道中,为此,他们要关联在处理Http请求时触发的一系列事件中。要创建HttpMoudle,可以创建一个派生于IHttpModule接口的类

代码如下:

  1. namespace ZC.Utilities
  2. {
  3. public class HttpExceptionModule : IHttpModule
  4. {
  5. public void Dispose()
  6. {
  7. throw new NotImplementedException();
  8. }
  9.  
  10. public void Init(HttpApplication context)
  11. {
  12. throw new NotImplementedException();
  13. }
  14. }
  15. }

这个接口要实现两个方法:Init和Dispose。Dispose方法不多介绍,用于释放非托管资源,Init方法是实现HttpMoudle功能的主要方法,它有一个方法参数HttpApplication context。这个参数允许访问当前的HttpApplication环境,它用于封装在请求处理过程中触发的不同事件。下图列出了可以在Init方法中注册的事件,以及这些事件的执行顺序:

(6)、Demo

给每个页面上都添加文本,但是页面很多,所以这个时候通过HttpMoudle修改Http输出流,就是一种非常好的方式,代码如下:

Web.config

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <!--
  4. 有关如何配置 ASP.NET 应用程序的详细信息,请访问
  5. http://go.microsoft.com/fwlink/?LinkId=169433
  6. -->
  7.  
  8. <configuration>
  9. <system.web>
  10. <compilation debug="true" targetFramework="4.5" />
  11. <httpRuntime targetFramework="4.5" />
  12.  
  13. <httpModules>
  14. <add name="AppendMsg" type="Utils.AppendMsg, Utils" />
  15. </httpModules>
  16. </system.web>
  17. </configuration>

AppendMsg.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace Utils
  7. {
  8. public class AppendMsg : IHttpModule
  9. {
  10. HttpApplication _application = null;
  11. public void Init(HttpApplication context)
  12. {
  13. _application = context;
  14. _application.EndRequest += AppendMsgMethod;
  15. }
  16.  
  17. private void AppendMsgMethod(object obj,EventArgs args) {
  18. _application.Context.Response.Write(string.Format("Time is {0}", DateTime.Now.ToLocalTime()));
  19. }
  20.  
  21. public void Dispose()
  22. {
  23.  
  24. }
  25. }
  26. }

注意web程序需要添加Utils的引用

查看源码如下:

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
  3.  
  4. </title></head>
  5. <body>
  6. <form method="post" action="./WebForm3.aspx" id="form1">
  7. <div class="aspNetHidden">
  8. <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="Y+jLHJQqIdubeA4PeKlp73tJF/5kr6OGFtrvvOUxgE1PuiLiIeQS3d3CuoCU/FiS37xouTrBPHNkumgGNrWOOQXSa8ygtC5ttdbA2seVKgo=" />
  9. </div>
  10.  
  11. <div class="aspNetHidden">
  12.  
  13. <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="6C325D90" />
  14. </div>
  15. <div>
  16.  
  17. </div>
  18. </form>
  19. </body>
  20. </html>
  21. Time is 2017/6/8 11:11:28

ok,所有的页面都做了同一个append操作。

(7)、HttpHandler

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace web
  7. {
  8. /// <summary>
  9. /// Handler1 的摘要说明
  10. /// </summary>
  11. public class Handler1 : IHttpHandler
  12. {
  13.  
  14. public void ProcessRequest(HttpContext context)
  15. {
  16. context.Response.ContentType = "text/plain";
  17. context.Response.Write("Hello World");
  18. }
  19.  
  20. public bool IsReusable
  21. {
  22. get
  23. {
  24. return false;
  25. }
  26. }
  27. }
  28. }

HttpHandler不同与HttpModule,主要有以下几点:

a、HttpHandler是请求管道的最后一战,是终点,而HttpModule则不是

b、HttpHandler必须映射为特定的扩展名,也就是说必须是以.ashx结尾的才能算是HttpHandler

HttpHandler实现IHttpHandler接口,该接口维护一个方法和一个属性分别是ProcessRequest()和IsReusable属性

ProcessRequest()方法:

用于处理入站的Http请求

这两句代码设置了在默认情况下,类模块会把内容类型改写为纯文本,然后把"Hello World"写入输出流.

IsReusable属性:
该属性告诉入站的Http请求是否可重用这个HttpHandler实例

(8)在IIS中映射文件扩展名

模块和处理程序之通过HttpModule和HttpHandler拦截入站HTTP请求执行指定托管代码模块的更多相关文章

  1. ASP.NET-自定义HttpModule与HttpHandler

    在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中,这时,就是Http Modules和Ht ...

  2. HttpModule与HttpHandler详解

    ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...

  3. HttpModule,HttpHandler,HttpHandlerFactory

    HttpModule:Http模块,可以在页面处理前后.应用程序初始化.出错等时候加入自己的事件处理程序. HttpHandler:Http处理程序,处理页面请求 HttpHandlerFactory ...

  4. 002. Asp.Net Routing与MVC 之(基础知识):HttpModule 与 HttpHandler

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

  5. 转:HttpModule与HttpHandler详解

    ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...

  6. ASP.NET-自定义HttpModule与HttpHandler介绍

    ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...

  7. HttpModule与HttpHandler详解(转)

    ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...

  8. HttpModule、HttpHandler和Page的生命周期

    1.引言 2.两个处理步骤 2.1.创建ASP.NET环境 2.2.用触发的MHPM事件处理请求 3.什么事件中应该做什么 4.示例代码 5.深入ASP.NET页面事件 1.引言 这篇文章我们将试图理 ...

  9. 第七章 设计程序架构 之 设计HTTP模块和处理程序

    1. 概述 HTTP模块和处理程序,可以让程序员直接跟HTTP请求交互. 本章内容包括 实现同步和异步模块及处理程序以及在IIS中如何选择模块和处理程序. 2. 主要内容 2.1 实现同步和异步模块及 ...

随机推荐

  1. 如何从官网开始 mongo java

    http://docs.mongodb.org/ecosystem/drivers/ MongoDB Driver Documentation Getting Started Installation ...

  2. Hello_Motion_Tracking 任务一:Project Tango采集运动追踪数据

    我们来看一下中的几个基本的例子 (区域描述.深度感知.运动追踪.视频4个) 参考:Google Tango初学者教程 1. hello_motion_tracking package com.proj ...

  3. 基于jCOM搭建Java-微软信息桥梁(下)

    第一部分析了BEA提供的Java/COM互操作解决方案—jCOM的实现原理:本文是第二部分,比较全面地分析了Weblogic Server的jCOM实现技术之后,通过一个具体实例来说明了jCOM的具体 ...

  4. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)

    转载自  http://www.blogjava.net/Todd/archive/2010/04/22/295112.html 方法一:在初始化时保存ApplicationContext对象 代码: ...

  5. Sqler-Cmd

    针对于sqler 工具cmd 部分 做了如下整理 1 Cluster Model 2 Regedit Model $servers= '192.168.25.xx','192.168.25.yy' W ...

  6. Webservice发布

    此文甚好,转载自:http://blog.163.com/java_player@126/blog/static/127930738200981555021925/ 某些地方笔者已经加以改进. 使用工 ...

  7. 会HTML/CSS就可以轻松创建网站

    网站其本质就是HTML + CSS 外加一些JavaScript构成的.所以基本上只要你会一些前端,就可以开始花样搭网站了. 如果只用HTML/CSS那做出来的网站只能叫静态网站,性能好但维护不方便, ...

  8. java学习笔记—第三方数据库连接池包1(29)

    第一步:导入dbcp包 第二步:通过核心类连接数据 BasicDataSource它是javax.sql.DataSrouce的子类. 一个工具类:BasicDataSourceFactory. 手工 ...

  9. java学习笔记—Tomcat(9)

    1 目录结构 bin  二进制目录,主要存储的是一些启动和停止服务器的命令startup.bat conf  配置目录,server.xml web.xml lib  服务器软件使用的第三方的j ...

  10. J - Judge(快速幂)(同余定理)

    J - Judge   Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit S ...