【ASP.NET】IHttpHandler和IHttpModule
上篇文章我们主要讲了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的更多相关文章
- 如何将IHttpHandler和IHttpModule迁移到ASP.NET Core中间件
ASP.NET Core是一个跨平台.开源的框架,用于在Windows.Mac和Linux操作系统(OS)上开发web应用程序.你可以使用以下任何IDE开发ASP.NET Core 应用程序: Vis ...
- Asp.Net IHttpHandler介绍
ASP.NET响应Http请求时常用的两个处理接口是IHttpHandler和IHttpModule. 一般的,IHttpHandler用来处理一类特定的请求,比如对每个*.asp, *.aspx文件 ...
- ASP.NET中IHttpHandler与IHttpModule的区别(带样例说明)
IHttpModule相对来说,是一个网页的添加 IHttpHandler相对来说,却是网页的替换 先建一个HandlerDemo的类 using System; using System.Colle ...
- HTTP请求处理流程、IHttphandler、IHttpModule
一.ASP.NET处理管道 Asp.net处理管道的第一步是创建HttpWorkerRequest对象,它包含于当前请求有关的所有信息. HttpWorkerRequest把请求传递给HttpRunt ...
- 【IHttpHandler】IHttpModule实现URL重写
1.用自定义IHttpModule实现URL重写 一般来说,要显示一些动态数据总是采用带参数的方式,比如制作一个UserInfo.aspx的动态页面用于显示系统的UserInfo这个用户信息表的数据, ...
- asp.net IHttpHandler浅析
在asp.net程序中,我们可以通过配置url的path路径的方式,将某个path路径下的请求交给指定的IHttpHandler去处理,这便是对request请求进行编程. 一.新建一个framewo ...
- 转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]
前言 在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只 ...
- Sample ASP.NET IHttpHandler
LoggerHandler.cs using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...
- ASP.NET运作流程
当我们在浏览器输入域名访问服务器资源时,会向服务器发送Http请求,并经由IIS处理后,交由ASP.NET托管程序处理,进入ASP.NET管道.在IIS内部如何处理我们不需要深入去了解,在ASP.NE ...
随机推荐
- 你还在用notifyDataSetChanged?
想到发这篇帖子是源于我的上一篇帖子#Testin杯#多线程断点续传后台下载 .帖子中讲述的项目使用了listView这个控件,而且自定义了adapter.在更新item的进度条时发现每次使用notif ...
- 轻量级HTTP服务器Nginx(配置与调试Nginx)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ixdba.blog.51cto.com/2895551/790611 Nginx ...
- 数据存储之 SharedPreference 共享参数 (转)
在上一讲中,我们学习了如何将数据存储在SD卡中[数据存储之File文件存储 [即SD卡的写入与读取]],这是一种存储方式,这一讲我们来学习一下使用SharedPreferences存储数据. ...
- 原生js实现单屏滚动
类似于fullpage的单屏滚动,使用原生JS实现,不依赖任何js库: css: html,body {height:100%;} body {margin:0px;} div {height:100 ...
- 【BZOJ2287】消失之物 [分治][DP]
消失之物 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ftiasch 有 N 个物品, ...
- 【BZOJ4491】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- 「6月雅礼集训 2017 Day8」gcd
[题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...
- 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推
[题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...
- 如何设计一个优雅健壮的Android WebView?(上)
转:如何设计一个优雅健壮的Android WebView?(上) 前言 Android应用层的开发有几大模块,其中WebView是最重要的模块之一.网上能够搜索到的WebView资料可谓寥寥,Gith ...
- Java面试通关要点汇总集(山东数漫江湖)
这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术.本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答.敬 ...