上篇文章我们主要讲了HttpApplicatiion管道事件,那么我么如何处理这些管道事件呢,以及请求在ASP.NET是如何执行的呢,我们来了解一下IHttpHandler和IHttpModule

引言:

处理HttpApplicatiion事件

  HttpApplication提供了基于事件的扩展机制,允许程序员借助于处理管道中的事件进行处理过程扩展。由于HttpApplication对象是ASP.NET基础架构来创建和维护,那么如何才能获得这个对象引用,以便于注册HttpApplication对象的事件处理,在ASP.NET中提供了两种方式来 解决这个问题:IHttpModule和global.aspx,这两种方式的核心都是IHttpModule几口,下面我们就主要讲IHttpModule。

正文:

IHttpModule的用途以及用法

  在ASP.NET中,定义在System.Web命名空间下的IHttpModule接口专门用了定义HttpApplication对象的事件处理。

  实现IHttpModule接口的类成为HttpModule。IHttpModule接口的定义如下,仅仅包含两个成员:

public interface IHttpModule
{
void Dispose()
void Init(HttpApplication context)
}

  其中,Dispose方法用于回收Module所使用的非托管资源,如果没有的话,直接返回即可。

  最重要的是第二个方法Init,可以看到这个方法接受一个HttpApplication类型的参数,在ASP.NET中,每当创建一个HttpApplication对象实例,将遍历注册的HttpModule类型,通过反射依次创建 么个注册HttpModule类型的一个实例对象,并将这个HttpApplication实例通过Init方法传递给各个HttpModule,这样HttpModule对象就可以在第一时间完成针对HttpApplication对象的事件注册了。

  例如,希望写一个PostAuthenticateRequest事件的HttpModule,那么就可以完成以下注册

pulic class xxx:IHttpModule
{
void Dispose()
void Init(HttpApplication app)
{
app.PostAuthencateRequest+=new EventHandler(app_PostAuthencateRequest)
}
}

  当然,实现IHttpModule接口只是实现HttpModule的一部分,在ASP.NET中所使用的HttpModule还要在网站配置文件中进行注册才能真正生效,并在ASP.NET中使用,这一点我们就不在讲解了,下面看一下IHttpHandler。

IHttpHandler

  在ASP.NET中,请求的真正处理就是在处理程序这个环节,也就是在HttpApplication19个标准事件的PreRequestHandlerExcute和PostRequestHandlerExcute之间,PreRequestHandlerExcute负责同志程序员,处理程序就要开始工作了,PostRequestHandlerExcute事件同志程序员ASP.NET服务器的处理程序已经完成。那么HttpApplication的作用是什么呢?我们可以把它看做请求到达处理程序和离开处理程序的一个管道,这个管道提供了统一处理所有请求的机制,使得我们可以在请求被真正处理之前和处理之后进行预处理和处理后的工作。

  处理程序负责完成实际的请求处理工作,对于网站开发人员来说,大多数的开发工作是围绕着处理程序展开的。(其实我们可以看到,我们的页面类也就是Page实现了IHttphandler接口)实际上,接触到HttpApplication事件处理的时候并不多,处理程序在不同的网站开发技术中有不同的名字,在ASP.NET中,为HttpHandler。

  在ASP.NET中,所有的处理程序类必须实现IHttpHandler接口或者实现IHttpAsyncHandler接口,我们可以很明显看出区别来,一个是同步接口,一个是异步处理模式的接口。那么我们通常使用的是同步模式的接口。下面我们简单介绍一下

  这两个接口都定义在System.Web下,IHttphandler接口的定义如下

  

public interface IHttpHandler
{
void ProcessRequest(HttpContext context)
bool IsRequest{get;}
}

  ProcessRequest是这个接口的主要方法,接收一个HttpContext类型的请求上下文对象,通过这个对象,处理程序可以得到关于处理请求所需的信息,通过这个参数的Response属性可以得到管理回应的对象,可以向客户端返回服务器的处理结果。

  IsRequest属性表示当这个处理程序对象在使用之后,是否还可以被缓存起来,在以后的请求处理中用。

当然,同样的是我们也要注册处理程序,每一种处理处理程序用来处理一类的请求,处理程序与请求之间的匹配关系可以在网站的配置文件中通过配置参数来进行设置。

【ASP.NET】IHttpHandler和IHttpModule的更多相关文章

  1. 如何将IHttpHandler和IHttpModule迁移到ASP.NET Core中间件

    ASP.NET Core是一个跨平台.开源的框架,用于在Windows.Mac和Linux操作系统(OS)上开发web应用程序.你可以使用以下任何IDE开发ASP.NET Core 应用程序: Vis ...

  2. Asp.Net IHttpHandler介绍

    ASP.NET响应Http请求时常用的两个处理接口是IHttpHandler和IHttpModule. 一般的,IHttpHandler用来处理一类特定的请求,比如对每个*.asp, *.aspx文件 ...

  3. ASP.NET中IHttpHandler与IHttpModule的区别(带样例说明)

    IHttpModule相对来说,是一个网页的添加 IHttpHandler相对来说,却是网页的替换 先建一个HandlerDemo的类 using System; using System.Colle ...

  4. HTTP请求处理流程、IHttphandler、IHttpModule

    一.ASP.NET处理管道 Asp.net处理管道的第一步是创建HttpWorkerRequest对象,它包含于当前请求有关的所有信息. HttpWorkerRequest把请求传递给HttpRunt ...

  5. 【IHttpHandler】IHttpModule实现URL重写

    1.用自定义IHttpModule实现URL重写 一般来说,要显示一些动态数据总是采用带参数的方式,比如制作一个UserInfo.aspx的动态页面用于显示系统的UserInfo这个用户信息表的数据, ...

  6. asp.net IHttpHandler浅析

    在asp.net程序中,我们可以通过配置url的path路径的方式,将某个path路径下的请求交给指定的IHttpHandler去处理,这便是对request请求进行编程. 一.新建一个framewo ...

  7. 转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]

    前言 在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只 ...

  8. Sample ASP.NET IHttpHandler

    LoggerHandler.cs using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...

  9. ASP.NET运作流程

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

随机推荐

  1. git branch 重命名

    有时候你会有重命名一个git branch的冲动,不要怀疑,这是真的.command bellow will give u a big help,no thanks~ git branch - m o ...

  2. Chrome控制台报错个人总结(不定时更新)

    最近开始使用Chrome控制台检测代码错误,对于经常碰到的报错做一个汇总,免得每次遇到都要重新想一遍策略,错误原因,重复劳动,浪费时间. 由于不是每个错误都能碰到,以下仅列出个人写代码时经常碰到的报错 ...

  3. 51Nod 1062 序列中最大的数 | 简单DP

    #include "iostream" #include "cstdio" using namespace std; #define LL long long ...

  4. MyBatis框架的使用及源码分析(三) 配置篇 Configuration

    从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConf ...

  5. 修改Maven仓库地址

    在%USERPROFILE%\.m2\settings.xml例如:C:\Users\LongShu\.m2\settings.xml 可以自定义Maven的一些参数, 复制%M2_HOME%\con ...

  6. bzoj 2121 DP

    首先如果我们能处理出来i,j段能不能消掉,这样就可以直接dp转移了,设w[i]为前i为最少剩下多少,那么w[i]=w[j-1] (flag[j][i]). 现在我们来求flag[i][j],首先我们可 ...

  7. js 验证ip列表

    如题. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  8. CSS浮动和清除

    float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...

  9. 檢查 cpu 的全部 gpio 狀態及設定

    $ adb root # cat /sys/kernel/debug/gpio

  10. java===java基础学习(16)---final

    final-----概念 1.当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰. 2.当不希望类的某个变量的值被修改时,可以用final修饰.如果要用final,则必 ...