广告
返回顶部
首页 > 资讯 > 精选 >如何进行HttpHandler与HttpModule的分析与应用
  • 880
分享到

如何进行HttpHandler与HttpModule的分析与应用

2023-06-17 09:06:34 880人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关如何进行HttpHandler与HttpModule的分析与应用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。神秘的HttpHandler与HttpModule大

这篇文章将为大家详细讲解有关如何进行HttpHandler与HttpModule的分析与应用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

神秘的HttpHandler与HttpModule

大学时候我是从拖控件开始学习asp.net的,对.net的很多类库对象都不是很了解。所以看到大家写一些个性的asp.net名词,就感觉asp.net总有一层神秘的面纱笼罩着,让我琢磨不透,相信园子里面也有很多和我经历差不多的.net攻城师。在以前看HttpHandler与HttpModule都是神秘莫测的。哈哈,今天我为大家展示下我对他的理解,以及应用。

也许你不懂HttpHandler与HttpModule(大侠Return),也许你不知道HttpHandler与HttpModule的用途,也许你似懂非懂。今天,请让我带领大家去领略一下HttpHandler与HttpModule的风采,今天我要让他变得So Easy !!

理解asp.net管线事件

何谓asp.net管线?简单的说就是页面的生命周期,就是页面从你开始请求到展现在你的浏览器期间,asp.net所做的一系列事件。下面给你展现下这些事件(参见与Fish Li)。

对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。 有关更多信息,请参见 ValidateRequest 和脚本侵入概述。

如果已在 WEB.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

引发 BeginRequest 事件。

引发 AuthenticateRequest 事件。

引发 PostAuthenticateRequest 事件。

引发 AuthorizeRequest 事件。

引发 PostAuthorizeRequest 事件。

引发 ResolveRequestCache 事件。

引发 PostResolveRequestCache 事件。

根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。 如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。

引发 PostMapRequestHandler 事件。

引发 AcquireRequestState 事件。

引发 PostAcquireRequestState 事件。

引发 PreRequestHandlerExecute 事件。

为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 IHttpAsyncHandler.BeginProcessRequest)。 例如,如果该请求针对某页,则当前的页实例将处理该请求。

引发 PostRequestHandlerExecute 事件。

引发 ReleaseRequestState 事件。

引发 PostReleaseRequestState 事件。

如果定义了 Filter 属性,则执行响应筛选。

引发 UpdateRequestCache 事件。

引发 PostUpdateRequestCache 事件。

引发 EndRequest 事件。

引发 PreSendRequestHeaders 事件。

引发 PreSendRequestContent 事件。

注意:

记着上面这些事件,不是瞎写的,他们的顺序更不是瞎写的。是页面从开始请求到页面展现结束,他们是从一到二十四,从上到下,依次触发的。

从BeginRequest开始的事件,并不是每个事件都会被触发,因为在整个处理过程中,随时可以调用Response.End() 或者有未处理的异常发生而提前结束整个过程。所有事件中,只有EndRequest事件是肯定会触发的, (部分Module的)BeginRequest有可能也不会被触发。

如果是IIS7,第10个事件也就是MapRequestHandler事件,而且在EndRequest 事件前,还增加了另二个事件:LogRequest 和 PostLogRequest 。只有当应用程序在 IIS 7.0 集成模式下运行,并且与 .NET Framework 3.0 或更高版本一起运行时,才会支持 MapRequestHandler、LogRequest 和 PostLogRequest 事件。

总结:这些事件我们可以随意在你需要的事件中添加方法,类,属性等一些列属于你自己对请求的操作。也就是说我们以前都是在页面级编程,现在,我们可以在请求级处理项目,处理请求。具体怎么做,要看下面的HttpMoudle和HttpHandler的神奇功效了。

理解HttpHandler与HttpModule

先说HttpHandler。

首先你应该明白asp.net是怎么处理我们的请求文件的,这里不扯与asp.net无足轻重的看似更加底层的神秘面纱,那么.net是怎么处理我们的请求文件的呢?给你看个东西。

打开你电脑上C:\windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。找到httpHandlers节点,看他下面都写了什么。你不想打开的话看我的。

<httpHandlers>        <add verb="*" path="*.rules" type="System.Web.HttpForbiddenHandler" validate="true"/>        <add verb="*" path="*.xoml" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>              <add path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>              <add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True"/>              <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True"/>              <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True"/>              <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True"/>              <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True"/>              <add path="*.asmx" verb="*" type="System.Web.Services.Protocols.WebServiceHandlerFactory, System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="False"/>              <add path="*.rem" verb="*" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="False"/>              <add path="*.soap" verb="*" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="False"/>              <add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.master" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.skin" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.browser" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.sitemap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.dll.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>              <add path="*.exe.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>              <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.csproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.vb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.vbproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.webinfo" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.licx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.resx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.resources" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.mdb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.vjsproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.java" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.jsl" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.ldb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.ad" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.dd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.ldd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.sd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.adprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.lddprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.sdm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.sdmDocument" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.exclude" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*.refresh" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>              <add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True"/>              <add path="*" verb="*" type="System.Web.HttpMethodNotAllowedHandler" validate="True"/>          </httpHandlers>

上面这段代码是这样理解的:在<httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理,对于.aspx来说,是由System.Web.UI.PageHandlerFactory来处理。而对于.cs来说,是由System.Web.HttpForbiddenHandler 处理....

上面的是默认Handler处理,当然知道了HttpHandler之后,我们也可以自己注册自己的HttpHandler,写自己的HttpHandler处理程序,处理不同类型的文件,这个等会儿我实现下,给大家看看。

问题: 既然HttpHandler的作用是将请求中,各个不同类型后缀名的文件,映射给不同的处理程序去处理,那么处理程序是在页面生命周期中的那个时间中映射处理请求的呢?

答: 依照上面的24个事件,这个HttpHandler节点中的映射是在第10个步骤中触发的。而他映射给不同的处理程序,这些处理程序中方法、类的实现是在第15步触发的。

再说HttpModule。

HttpHandler是针对一类型的文件,映射给指定的处理程序对请求进行出来。并且映射,与处理都发生在asp.net已经指定好的事件中。

而HttpModule则是针对所有的请求文件,映射给指定的处理程序对请求进行处理,而这些处理,可以发生在请求管线中的任何一个事件中。也就是说你订阅哪个事件,这写处理就发生于那个事件中,处理过后再执行,你订阅过的事件的下一个事件,当然你也可以终止所有事件直接运行***一个事件,这就意味这他可以不给HttpHandler机会,很牛的HttpModule。

HttpHandler的使用

HttpHandler的使用通过一种防盗链技术来演示

首先注册HttpHandler:在Web.config中注册

<httpHandlers>                  <!--映射jpg格式的文件,给Processhandler_test.CustomHandler处理。-->                  <!--type里面逗号之前 命名空间加类名(ProcessHandler_test.CustomHandler),后面程序集名称-->                  <add path="*.jpg" verb="*" type="httphander_test.CustomHandler, ProcessHandler_test" />              </httpHandlers>

上面注册是把网站中请求jpg格式文件的请求,映射给命名空间为httphander_test类名为CustomHandler的程序集ProcessHandler_test来处理请求。

如果想通过HttpHandler处理请求,必须在映射的处理程序中实现接口IHttpHandler

映射到的程序代码如下

namespace httphander_test  {      public class CustomHandler :IHttpHandler      {          public void ProcessRequest(HttpContext context)          {              // 获取文件服务器端物理路径              string FileName = context.Server.MapPath(context.Request.FilePath);              // 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片              if (context.Request.UrlReferrer.Host == null)              {                  context.Response.ContentType = "image/gif";                  context.Response.WriteFile("/error.gif");              }              else             {                  // 如果 UrlReferrer中不包含自己站点主机域名,则显示一张默认的禁止盗链的图片                  if (context.Request.UrlReferrer.Host.IndexOf("yourdomain.com") > 0)                  {                      context.Response.ContentType = "image/gif";                      context.Response.WriteFile(FileName);                  }                  else                 {                      context.Response.ContentType = "image/gif";                      context.Response.WriteFile("/error.gif");                  }              }          }           public bool IsReusable          {              get { throw new NotImplementedException(); }          }      }  }

上面这个简单的实例就完成了,如果有Jpg格式文件的请求,而不是在本网站的域名中请求,那么就会输出一个指定的错误图片来替换原连接图片。

总结:httpHandler的功能远不止这些,希望你能理解他是对一类文件请求的处理,也希望你能理解他在请求管道中的事件位置,这样对您理解会更有帮助。

HttpModule的使用

由于HttpModule过于强大的功能,也就是说任何一个请求都要经过注册过的HttpModule处理程序,所以大家在用他的时候一定要对各种请求做好判断,也就是处理什么请求,就让这个请求走那个处理程序,不要让他每个方法,都去执行。要不会让程序负重,得不偿失。

使用HttpModule跟HttpHandler的步骤类似,而HttpModule实现的是IHttpModule接口。

关于如何进行HttpHandler与HttpModule的分析与应用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何进行HttpHandler与HttpModule的分析与应用

本文链接: https://www.lsjlt.com/news/288051.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行HttpHandler与HttpModule的分析与应用
    这篇文章将为大家详细讲解有关如何进行HttpHandler与HttpModule的分析与应用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。神秘的HttpHandler与HttpModule大...
    99+
    2023-06-17
  • 如何进行null与index的分析
    这期内容当中小编将会给大家带来有关如何进行null与index的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 今天在测试过程中遇到一问...
    99+
    2022-10-19
  • 如何用Python进行回归分析与相关分析
    目录一、前言1.1 回归分析1.2 相关分析二、代码的编写2.1 前期准备2.2 编写代码2.2.1 相关分析 2.2.2 一元线性回归分析 2.2.3 多元线性...
    99+
    2023-03-22
    python python回归分析 python相关分析
  • 如何进行系统分析与设计
    概述首先,系统是什么?根据《系统架构》一书的定义,系统是由一组实体和这些实体之间的关系所构成的集合,其功能要大于这些实体各自的功能之和。对于我们的场景,系统可能是 App、Web 应用、服务、批处理程序等,也可能是包括所有这些的一个大系统。...
    99+
    2023-06-05
  • 如何进行VS2005软件的理解与分析
    如何进行VS2005软件的理解与分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。看来是WebDeployment本身有一定的bug,笔者猜想可能是编码问题造成的,WebDep...
    99+
    2023-06-17
  • 如何进行Zookeeper分析与集群搭建
    本篇文章为大家展示了如何进行Zookeeper分析与集群搭建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Zookeeper简介Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命...
    99+
    2023-06-02
  • 如何进行malloc/free与new/delete的对比分析
    今天给大家介绍一下如何进行malloc/free与new/delete的对比分析。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。相同点:都可用于申请动态内存和释...
    99+
    2023-06-17
  • 如何进行AOP的应用分析
    这篇文章将为大家详细讲解有关如何进行AOP的应用分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通...
    99+
    2023-06-17
  • 如何进行CitizenMe的应用分析
    如何进行CitizenMe的应用分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。审核服务条款与性格测试第一个功能是跟踪记录用...
    99+
    2022-10-19
  • 分析概述IPv6与IPv4的应用与区别
    网购、网游、网聊、网络直播、网上… 这个年代要是没有了这张“网” 我们的生活几乎无法运行 你有想过网络互通如何实现的吗? 虚拟世界如何确定网上的...
    99+
    2022-11-12
  • 如何进行Unix与Linux操作系统差异的分析
    这篇文章给大家介绍如何进行Unix与Linux操作系统差异的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Unix与Linux操作系统是同一个操作系统吗是,也不是。或许这个答案有自相矛盾的地方,但是却是一个比较合理...
    99+
    2023-06-17
  • 如何进行Java中对HashMap的深度分析与比较
    如何进行Java中对HashMap的深度分析与比较,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能...
    99+
    2023-06-03
  • PHP 中使用 Elasticsearch 进行用户行为分析与推荐
    概述:随着互联网的不断发展,用户行为分析和个性化推荐已经成为了各大应用领域中不可或缺的一部分。而Elasticsearch作为一个高性能、分布式的全文搜索和分析引擎,正因其强大的搜索能力和灵活的扩展性而被广泛运用于用户行为分析与个性化推荐系...
    99+
    2023-10-21
    PHP elasticsearch 用户行为分析
  • 如何进行单元测试利器JUnit的实践与分析
    今天就跟大家聊聊有关如何进行单元测试利器JUnit的实践与分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。单元测试工具Junit是一个开源项目,昨天学习了一下这个东西,总结下心得。...
    99+
    2023-06-17
  • 如何进行域名的解析与绑定
    今天就跟大家聊聊有关如何进行域名的解析与绑定,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。那么有了注册了域名和购买了虚拟主机以后,怎么样才能在IE里输入你的域名就能打开你的站呢?这就...
    99+
    2023-06-08
  • 如何进行Java任务队列的定义与代码的分析
    如何进行Java任务队列的定义与代码的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java任务队列需要我们详细的学习,当然我们在不断的使用中还需要注意相关信息的学习。...
    99+
    2023-06-17
  • MHA调研与应用的示例分析
    小编给大家分享一下MHA调研与应用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MHA调研与应用 一、问题与...
    99+
    2022-10-18
  • Python如何调用kafka进行构建与应用
    本篇文章为大家展示了Python如何调用kafka进行构建与应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。近期遇到一个需求就是我们需要把当前比较耗费资源的接口开发成异步通讯的机制,简单来说就是有...
    99+
    2023-06-16
  • PHP 中使用 Elasticsearch 进行数据分析与可视化
    引言:随着大数据时代的到来,数据分析和可视化成为了企业决策和数据洞察的重要手段。而 Elasticsearch 作为一种强大的分布式搜索和分析引擎,为开发人员提供了丰富的API接口,使得可以方便地将数据存储到 Elasticsearch 中...
    99+
    2023-10-21
    数据分析 PHP elasticsearch
  • PHP 中使用 Elasticsearch 进行用户画像分析与推荐
    概述:用户画像分析与推荐是一种利用用户的行为数据和个人信息来构建用户标签,进而实现个性化推荐的方法。Elasticsearch 是一个强大的分布式搜索和分析引擎,它提供了丰富的功能和灵活的API,可用于构建用户画像分析与推荐系统。本文将介绍...
    99+
    2023-10-21
    推荐 elasticsearch 用户画像
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作