美文网首页HTTP请求
HttpModuler与HttpHandler介绍和简单使用

HttpModuler与HttpHandler介绍和简单使用

作者: 无为无味无心 | 来源:发表于2018-11-05 10:30 被阅读0次

1 Asp.Net中的处理流程

当客户端请求一个*文件的时候,这个请求会被inetinfo.exe(IIS相关的系统组件)进程截获,它判断文件类型后,将这个请求转交给ASPNET_ISAPI.dllASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端。

inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。

ASPNET_ISAPI.DLL:是处理.aspx文件的win32组件。其实IIS服务器是只能识别静态文件的,当IIS服务器发现被请求的文件是.aspx文件时,IIS服务器将其交给aspnet_isapi.dll来处理。

aspnet_wp.exe进程:ASP.NET框架进程,提运行的托管环境的CLR(公共语言运行时)就是寄存在此进程中。

ASP.NET Framework处理一个Http Request的流程:

HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

ASP.NET请求处理过程基于管道模型,管道模型由多个HttpModule和HttpHandler组成(默认19个管道事件),ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端,可以在每个HttpModule中都可以干预请求的处理过程。

2 HttpModule

2.1 自定义,实现System.Web.IHttpModule接口的类。

这里以简单在处理完请求后,输出一些公司的版权信息为例,关于context 可以注册的事件为19个,详细介绍参照图1.ASP.NET管道事件和页面生命周期示意图


public class WriteCompanyInfoModuler : System.Web.IHttpModule

{

public void Init(HttpApplication context)

{

context.EndRequest += new EventHandler((s, e) =>

{

HttpApplication httpAplication = (HttpApplication)s;

httpAplication.Response.Write("<!--VoBao CompanyInfo-->");

});

}

public void Dispose()

{

}

}

然后在Web.config 中配置如下节点System.web节点下:

<httpModules>

<add name="WriteCompanyInfoModuler" type="MyModuler.WriteCompanyInfoModuler"></add>

</httpModules>

name 为Moduler的名字,type:有两部分组成,前半部分是命名空间和类名组成的全名,后半部分是程序集名称。

可以在网站的任何一个网页下看到,如下信息:

clipboard.png

图一---ASP.NET管道事件和页面生命周期示意图(图片来源于黑马学生)


clipboard.png

在httpModule中自定义自己的HttpModule 可以实现登录,权限控制等操作。

3 HttpHandler

HttpHandler是处理客户端的请求上下文的最后步骤,对服务器页面进行编译实例化执行,将处理后的信息返回给客户端,一旦自定义HttpHandler 将覆盖系统的默认HttpHander.

3.1 示例:自定义文件类型,可以做验证码路径,UrlReWrite等。

public class MyHttpHandler : IHttpHandler

{

public MyHttpHandler(bool isReusable)

{

IsReusable = isReusable;

}

public void ProcessRequest(HttpContext context)

{

//处理请求,返回请求

context.Response.Write("这个自定义的shtml文件");

}

public bool IsReusable { get; private set; }

}

web.config配置:

<httpHandlers>

  <add verb="get" path="*.shtml" type="MyHttpHandlers.MyHttpHandler"></add>

</httpHandlers>

3.2 注意

ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览 器中。

4 IHttpModule与IHttpHandler的区别整理

1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的

2.对请求的处理上:

IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.

IHttpHandler则属于挑食类型,只有注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.

3.IHttpHandler按照你的请求 生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

ASP.Net系统本身配置有很多HttpHandler和HttpModule,以处理aspx等.Net标准的页面文件,以及这些页面文件中标 准的事件处理等。查看%System%/Microsoft.NET\Framework\v2.0.50727\CONFIG目录下的 nfig文件中的httpHandlers和httpModules节点,可以看到这些配置。如果有兴趣,可以使用Reflector查 看.Net系统中相关的类和方法,了解.Net如何处理以及做了什么处理。

.Net也提供了一套机制来开发自定义的HttpHandler和 HttpModule,均可以用于对HttpRequest的截取,完成自定义的处理。 HttpModule 继承System.Web.IHttpModule接口,实现自己的HttpModule类。必须要实现接口的两个方法:Init和Dispose。在 Init中,可以添加需要截取的事件;Dispose用于资源的释放,如果在Init中创建了自己的资源对象,请在Dispose中进行释放。

以上参考:http://www.educity.cn/develop/474379.html

相关文章

网友评论

    本文标题:HttpModuler与HttpHandler介绍和简单使用

    本文链接:https://www.haomeiwen.com/subject/qtgjxqtx.html