通过IHttpModule,IHttpHandler扩展IIS
- IIS对Http Request的处理流程
当Windows Server收到从浏览器发送过来的http请求,处理流程如下(引用自官方文档):

最终请求会被w3wp.exe处理,处理过程如下:

左边蓝色的部分是对Request的处理流程(从上到下),IHttpModule就是用来跟踪和控制这整个过程的接口。
- IHttpModule
我们通过自定义IHttpModule的实现,订阅上述所有所有事件来跟踪和控制请求的处理过程。这样我们可以在请求被真正处理(Handler Excecution)之前,对请求进行自定义的预处理,比如说对Url的重写。代码如下:
public class UrlRewriteModule:IHttpModule
{
public void Dispose()
{
//throw new NotImplementedException();
} public void Init(HttpApplication context)
{
context.PostAuthenticateRequest += OnPostAuthenticatRequest;
} private void OnPostAuthenticatRequest(object sender, EventArgs arg)
{
var app = sender as HttpApplication;
if (app != null)
{
var regex = new Regex(@"^/\w+/HelloWorld.jhtml$");
if(regex.IsMatch(app.Request.Path))
{
app.Context.RewritePath(regex.Replace(app.Request.Path, "/HelloWorld.jhtml"));
//将http://{serverUrl}/xxxxxxx/HelloWorld.jhtml Rewrite 到 http://{serverUrl}/HelloWorld.jhtml
}
}
}
}
- IHttpHandler
那IHttpHandler又是什么鬼?IHttpHandler是真正为每一个请求获取最终输出给Client的资源的接口。IIS默认有了很多的Handler来处理各种类型的请求,我们打开IIS中网站的Handler Mapping可以看到:

这里很多的Module同时充当了Handler. 可以自己实现IHttpHandler接口来支持新的请求类型。上面IHttpModule的例子中,Client访问了一个扩展名为.jhtml的资源,这个IIS默认是不支持的。可以实现IHttpHandler来支持这种类型,代码如下:
public class JHtmlHandler:IHttpHandler
{ public bool IsReusable
{
get { return true; }
} public void ProcessRequest(HttpContext context)
{
context.Response.WriteFile(context.Request.PhysicalPath);
}
}
这里只是简单的将请求的物理文件返回给Client.
- 自定义IHttpModule和IHttpHandler的部署
要将开发的IHttpModule与IHttpHandler部署到网站,有很多种方法:
1. 将IHttpModule与IHttpHandler的实现编译为Dll,将Dll放入网站的bin目录
2. 将IHttpModule与IHttpHandler的实现编译为强名Dll, 将Dll注册到GAC
最后修改网站的web.config,应用自定义的IHttpModule和IHttpHandler,配置如下(网站Application Pool配置为集成模式运行),此处是以将Dll注册到GAC:
<system.webServer>
<modules>
<add name="rewriteModule" type="ModuleSample.UrlRewriteModule,ModuleSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1c9f38745200151a,processorArchitecture=MSIL" />
</modules>
<handlers>
<add name="JHtmlHandler" path="*.jhtml" verb="*" type="ModuleSample.JHtmlHandler,ModuleSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1c9f38745200151a" />
</handlers>
</system.webServer>
通过IHttpModule,IHttpHandler扩展IIS的更多相关文章
- ASP.NET IHttpModule IHttpHandler IHttpHandlerFactory 拦截请求
先来看看代码,拦截所有Http请求类.下面包含了两种类的集成 IHttpModule IHttpHandlerFactory using System; using System.Collection ...
- IIS与ASP.NET管道
IIS 5.x与ASP.NET 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.aspx,.asmx等)请求的,整个过程基本上可以通过图1体现. IIS 5.x运行在进程InetIn ...
- [ASP.NET]谈谈IIS与ASP.NET管道
作为一个Asp.Net平台开发者,非常有必要了解IIS和Asp.Net是如何结合,执行我们的托管代码,以及Asp.Net管道事件的. 本节目录 IIS 5.X IIS 6 IIS 7+ 集成模式 As ...
- WCF技术剖析之二:再谈IIS与ASP.NET管道
原文地址:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 在2007年9月份,我曾经写了三篇详细介绍IIS架构和ASP.NE ...
- IIS 5.x与ASP.NET
转自:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.as ...
- IIS 7.0的集成模式和经典模式
IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库, 原先运行于IIS6.0下的Web应用程序迁移到IIS7 ...
- IIS经典模式与集成模式
在IIS7.0中Web应用程序有两种配置形式:经典和集成 经典模式 经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7 ...
- [Asp.net]IIS经典和继承模式
引言 由于要在客户那里部署项目,就研究了一下IIS中的集成和经典模式,这里做一些笔记.希望对您有所帮助. IIS7.0和IIS6.0 IIS7.0的web应用程序有两种配置模式:经典模式和集成模式.经 ...
- 谈谈IIS与ASP.NET管道
作为一个Asp.Net平台开发者,非常有必要了解IIS和Asp.Net是如何结合,执行我们的托管代码,以及Asp.Net管道事件的. 本节目录 IIS 5.X IIS 6 IIS 7+ 集成模式 As ...
随机推荐
- OSTU二值化算法
介绍 Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为: 1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个 ...
- 选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)
- nodejs 设计模式
1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实例对象,并将实例对象保存在静态变量中,当下次请求时,则可以直接返回这 ...
- echarts3结合openlayers2实现Map类型图表
网上查阅了部分资料,有些是用echarts2实现的,因echarts2无法满足项目中其他部分的要求,故只能采用echarts3(2017/9/18,echarts3官网突然把基于geo的demo下架了 ...
- SpiralOrderTraverse,螺旋遍历二叉树,利用两个栈
问题描述:s型遍历二叉树,或者反s型遍历二叉树 算法分析:层序遍历二叉树只需要一个队列,因为每一层都是从左往右遍历,而s型遍历二叉树就要用两个栈了,因为每次方向相反. public static vo ...
- jedis使用管道(pipeline)对redis进行读写(使用hmset、hgetall测试)
一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client.这有点类似于HBase的Scan, ...
- python 图像库PIL详解
PIL详细文档 The most important class in the Python Imaging Library is the Image class, defined in the mo ...
- Prism初研究之使用Prism实现WPF的MVVM模式
转自:http://www.cnblogs.com/qianzi067/p/5804880.html
- mysql中的左连接右连接内连接
一. 初始化SQL语句 /*join 建表语句*/ drop database if exists test; create database test; use test; /* 左表t1*/ dr ...
- sql语言分类与整理:DQL\DML\DDL
整体分为三类: 数据库查询语言(DQL,data QUERY LANGUAGE):对表的查询语句,select 数据库定义语言(DDL,data defined LANGUAGE):create da ...