模块和处理程序之通过HttpModule和HttpHandler拦截入站HTTP请求执行指定托管代码模块
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接口的类
代码如下:
namespace ZC.Utilities
{
public class HttpExceptionModule : IHttpModule
{
public void Dispose()
{
throw new NotImplementedException();
} public void Init(HttpApplication context)
{
throw new NotImplementedException();
}
}
}
这个接口要实现两个方法:Init和Dispose。Dispose方法不多介绍,用于释放非托管资源,Init方法是实现HttpMoudle功能的主要方法,它有一个方法参数HttpApplication context。这个参数允许访问当前的HttpApplication环境,它用于封装在请求处理过程中触发的不同事件。下图列出了可以在Init方法中注册的事件,以及这些事件的执行顺序:
(6)、Demo
给每个页面上都添加文本,但是页面很多,所以这个时候通过HttpMoudle修改Http输出流,就是一种非常好的方式,代码如下:
Web.config
<?xml version="1.0" encoding="utf-8"?> <!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" /> <httpModules>
<add name="AppendMsg" type="Utils.AppendMsg, Utils" />
</httpModules>
</system.web>
</configuration>
AppendMsg.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Utils
{
public class AppendMsg : IHttpModule
{
HttpApplication _application = null;
public void Init(HttpApplication context)
{
_application = context;
_application.EndRequest += AppendMsgMethod;
} private void AppendMsgMethod(object obj,EventArgs args) {
_application.Context.Response.Write(string.Format("Time is {0}", DateTime.Now.ToLocalTime()));
} public void Dispose()
{ }
}
}
注意web程序需要添加Utils的引用
查看源码如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title> </title></head>
<body>
<form method="post" action="./WebForm3.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="Y+jLHJQqIdubeA4PeKlp73tJF/5kr6OGFtrvvOUxgE1PuiLiIeQS3d3CuoCU/FiS37xouTrBPHNkumgGNrWOOQXSa8ygtC5ttdbA2seVKgo=" />
</div> <div class="aspNetHidden"> <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="6C325D90" />
</div>
<div> </div>
</form>
</body>
</html>
Time is 2017/6/8 11:11:28
ok,所有的页面都做了同一个append操作。
(7)、HttpHandler
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace web
{
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
} public bool IsReusable
{
get
{
return false;
}
}
}
}
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请求执行指定托管代码模块的更多相关文章
- ASP.NET-自定义HttpModule与HttpHandler
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中,这时,就是Http Modules和Ht ...
- HttpModule与HttpHandler详解
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- HttpModule,HttpHandler,HttpHandlerFactory
HttpModule:Http模块,可以在页面处理前后.应用程序初始化.出错等时候加入自己的事件处理程序. HttpHandler:Http处理程序,处理页面请求 HttpHandlerFactory ...
- 002. Asp.Net Routing与MVC 之(基础知识):HttpModule 与 HttpHandler
本文By 杨工. 一. Http.sys http.sys 从Win2003和WinXP SP2开始,就成为windows操作系统内核驱动程序,能够让任何应用程序通过它提供的接口,以http协议进行信 ...
- 转:HttpModule与HttpHandler详解
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- ASP.NET-自定义HttpModule与HttpHandler介绍
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- HttpModule与HttpHandler详解(转)
ASP.NET对请求处理的过程:当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,A ...
- HttpModule、HttpHandler和Page的生命周期
1.引言 2.两个处理步骤 2.1.创建ASP.NET环境 2.2.用触发的MHPM事件处理请求 3.什么事件中应该做什么 4.示例代码 5.深入ASP.NET页面事件 1.引言 这篇文章我们将试图理 ...
- 第七章 设计程序架构 之 设计HTTP模块和处理程序
1. 概述 HTTP模块和处理程序,可以让程序员直接跟HTTP请求交互. 本章内容包括 实现同步和异步模块及处理程序以及在IIS中如何选择模块和处理程序. 2. 主要内容 2.1 实现同步和异步模块及 ...
随机推荐
- java文件的读写程序代码
package textopen; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutp ...
- ZOJ2201 No Brainer 2017-04-16 19:21 54人阅读 评论(0) 收藏
No Brainer Time Limit: 2 Seconds Memory Limit: 65536 KB Zombies love to eat brains. Yum. Input ...
- Vivado&ISE&Quartus II调用Modelsim级联仿真
博主一直致力寻找高效的工作方式,所以一直喜欢折腾软件,从刚开始只用软件IDE自带的编辑器,到Notepad++,再到后来的Vim,从用ISE14.7自带的Isim仿真,到发现更好的Modelsim,再 ...
- D3 数据可视化实战 笔记
学习真是件奇妙的事情.这本书我之前都看过,有些的知识点却完全没有印象. 总结:把用到的知识好好研究:平时可以了解其他技术的基础,把相关的资料和难点记录下来. javascript陷阱 1.变量类型 v ...
- Java反射API研究(2)——java.lang.reflect详细内容与关系
对于最新的java1.8而言,reflect中接口的结构是这样的: java.lang.reflect.AnnotatedElement java.lang.reflect.AnnotatedType ...
- DotNetBar.MetroTilePanel 样式、加载数据、获取数据
描述下:MetroTilePanel包含子集ItemContainer 子集下面又包含子集MetroTileItem 目前我用到的就是这三层 因为需求所以整个模块全部由代码实现 1.ItemCon ...
- JaveScript初学-基础语法
一.JavaScript数据类型 JavaScript中,一切皆对象. JavaScript拥有动态类型,使用var关键字(也可以不必)进行声明——字符串.数字.布尔.对象.Null.Undefine ...
- Working Set
类似于Visual Studio中的Solution 如果Eclipse中的project过多,而且不是同一个真实的项目中的,可以按Working Set对project进行组织,只是一个逻辑组织 操 ...
- win10下安装配置iis,发布iis
老有朋友不会配置iis跟发布iis,今天整理一下,欢迎参考借鉴 打开控制面板 找到 程序 点击程序 找到启用或关闭windows功能 在windows服务中找到 Internet Informati ...
- [Cocos2d-x for WP8学习笔记] 获取系统字体
在Cocos2d-x for WP8较新的版本中,获取字体这一块,在wp8下默认返回了null,只能内嵌字体文件解决. 其实可以通过下面的方法获取系统的字体文件 CCFreeTypeFont::loa ...