ASP.NET中httpmodules与httphandlers全解析

https://www.cnblogs.com/zpc870921/archive/2012/03/12/2391424.html

https://www.cnblogs.com/PiaoMiaoGongZi/p/5216089.html

https://www.cnblogs.com/xcsn/p/6939628.html

1、向每个页面动态添加一些备注或说明性的文字:

  有的网站每一个页面都会弹出一个广告或在每个页面都以注释形式(<!-- -->)加入网站的版权信息。如果在每个页面教编写这样的JS代码的话,对于大一点的网站,这种JS代码的编写与维护可是一个很繁琐枯燥的工作。

  有了HttpModule我们就可以很简单地解决这个问题了。HttpModule是客户端发出请求到客户端接收到服务器响应之间的一段必经之 路。我们完全可以在服务器处理完请求之后,并在向客户端发送响应文本之前这段时机,把这段注释文字添加到页面文本之后。这样,每一个页面请求都会被附加上 这段注释文字。

  这段代码究竟该在哪个事件里实现呢? PostRequestHandlerExecute和PreSendRequestContent之间的任何一个事件都可以,但我比较喜欢在EndRequest事件里编写代码。

  第一步:创建一个类库ClassLibrary831。

  第二步:编写一个类实现IHttpModule接口

  class TestModule:IHttpModule

  {

  public void Dispose()

  {

  }

  public void Init(HttpApplication context)

  {

  }

  }

  第三步:在Init事件中注册EndRequest事件,并实现事件处理方法

  class TestModule:IHttpModule

  {

  public void Dispose(){}

  public void Init(HttpApplication context)

  {

  context.EndRequest += new EventHandler(context_EndRequest);

  }

  void context_EndRequest(object sender, EventArgs e)

  {

  HttpApplication ha = (HttpApplication)sender;

  ha.Response.Write("<!--这是每个页面都会动态生成的文字。--grayworm-->");

  }

  }

  第四步:在Web.Conofig中注册一下这个HttpModule模块

  <httpModules>

  <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>

  </httpModules>

  name:模块名称,一般是类名

  type:有两部分组成,前半部分是命名空间和类名组成的全名,后半部分是程序集名称,如果类是直接放在App_Code文件夹中,那程序名称是App_Code。

  这样在Web站点是添加该类库的引用后,运行每个页面,会发现其源文件中都会加入“<!--这是每个页面都会动态生成的文字。--grayworm-->”这句话。同样的方法你也可以在其中加入JS代码。

  2、身份检查

  大家在作登录时,登录成功后,一般要把用户名放在Session中保存,在其它每一个页面的Page_Load事件中都检查Session中是否存在用户名,如果不存在就说明用户未登录,就不让其访问其中的内容。

  在比较大的程序中,这种做法实在是太笨拙,因为你几乎要在每一个页面中都加入检测Session的代码,导致难以开发和维护。下面我们看看如何使用HttpModule来减少我们的工作量

  由于在这里我们要用到Session中的内容,我们只能在AcquireRequestState和 PreRequestHandlerExecute事件中编写代码,因为在HttpModule中只有这两事件中可以访问Session。这里我们选择 PreRequestHandlerExecute事件编写代码。

  第一步:创建一个类库ClassLibrary831。

  第二步:编写一个类实现IHttpModule接口

  class TestModule:IHttpModule

  {

  public void Dispose()

  {

  }

  public void Init(HttpApplication context)

  {

  }

  }

  第三步:在Init事件中注册PreRequestHandlerExecute事件,并实现事件处理方法

  class AuthenticModule:IHttpModule

  {

  public void Dispose(){}

  public void Init(HttpApplication context)

  {

  context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);

  }

  void context_PreRequestHandlerExecute(object sender, EventArgs e)

  {

  HttpApplication ha = (HttpApplication)sender;

  string path = ha.Context.Request.Url.ToString();

  int n = path.ToLower().IndexOf("Login.aspx");

  if (n == -1) //是否是登录页面,不是登录页面的话则进入{}

  {

  if (ha.Context.Session["user"] == null) //是否Session中有用户名,若是空的话,转向登录页。

  {

  ha.Context.Response.Redirect("Login.aspx?source=" + path);

  }

  }

  }

  }

第四步:在Login.aspx页面的“登录”按钮中加入下面代码

  protected void Button1_Click(object sender, EventArgs e)

  {

  if(true)    //判断用户名密码是否正确

  {

  if (Request.QueryString["source"] != null)

  {

  string s = Request.QueryString["source"].ToLower().ToString();   //取出从哪个页面转来的

  Session["user"] = txtUID.Text;

  Response.Redirect(s); //转到用户想去的页面

  }

  else

  {

  Response.Redirect("main.aspx");    //默认转向main.aspx

  }

  }

  }

  第五步:在Web.Conofig中注册一下这个HttpModule模块

  <httpModules>

  <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>

  </httpModules>

  3、多模块的操作

  如果定义了多个HttpModule,在web.config文件中引入自定义HttpModule的顺序就决定了多个自定义HttpModule在处理一个HTTP请求的接管顺序。

  HttpHandler

  HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

  HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

  IHttpHandler接口声明

  public interface IHttpHandler

  {

  bool IsReusable { get; }

  public void ProcessRequest(HttpContext context); //请求处理函数

  }

  示例:把硬盘上的图片以流的方式写在页面上

  class TestHandler : IHttpHandler

  {

  public void ProcessRequest(HttpContext context)

  {

  FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);

  byte[] b = new byte[fs.Length];

  fs.Read(b, 0, (int)fs.Length);

  fs.Close();

  context.Response.OutputStream.Write(b, 0, b.Length);

  }

  public bool IsReusable

  {

  get

  {

  return true;

  }

  }

  }

  Web.Config配置文件

  <httpHandlers>

  <add verb="*" path="*" type="ClassLibrary831.TestHandler,ClassLibrary831"></add>

  </httpHandlers>

  Verb属性:指定了处理程序支持的HTTP动作。*-支持所有的HTTP动作;“GET”-支持Get操作;“POST”-支持Post操作;“GET, POST”-支持两种操作。

  Path属性:指定了需要调用处理程序的路径和文件名(可以包含通配符)。“*”、“*.aspx”、“showImage.aspx”、“test1.aspx,test2.aspx”

  Type属性:用名字空间、类名称和程序集名称的组合形式指定处理程序或处理程序工厂的实际类型。ASP.NET运行时首先搜索bin目录中的DLL,接着在GAC中搜索。

  这样程序运行的效果是该网站的任何一个页面都会显示worm.jpg图片。如何只让一个页面(default21.aspx)执行 HttpHandler中的ProcessRequest方法呢?最简单的办法是在Web.Config文件中把path配置信息设为 default21.aspx。

原文地址:https://www.cnblogs.com/liuqiyun/p/11732057.html

时间: 2024-10-28 20:18:14

ASP.NET中httpmodules与httphandlers全解析的相关文章

Asp.net中操作Excel的代码解析

一 . 使用Excel对象模型创建Excel文档: 1.创建简单的文档 1 try 2 { 3 //创建Excel程序对象 4 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 5 //设置创建WorkBook时,WorkBook包含表单个数 6 excel.SheetsInNewWorkbook = 1; 7 //创建WorkBook 8 ex

Angular.js中的指令——易懂全解析

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">angular.js中,指令是最基础的

asp.net中的ORA-12154: TNS: 无法解析指定的连接标识符

本机PL/SQL能正常连接,但是asp.net连接有问题. 临时解决方案: <add key="ConnectString" value="Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = xxx)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl)));Persist Security Info=True;Us

web.config中的httpModules与httpHandlers[转载]

ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过http管道(Http  PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端. inetinfo.exe进程:是www服务的进程,IIS服务和ASPNE

C# ASP.NET系统缓存全解析

原文:http://blog.csdn.net/wyxhd2008/article/details/8076105 目录(?)[-] 系统缓存全解析1系统缓存的概述 系统缓存全解析2页面输出缓存 系统缓存全解析3页面局部缓存 系统缓存全解析5文件缓存依赖 系统缓存全解析6数据库缓存依赖 统缓存全解析7第三方分布式缓存解决方案 Memcached和Cacheman 系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的.例如查询一些历史数据

Asp.net中GridView使用详解(很全,很经典)

http://blog.csdn.net/hello_world_wusu/article/details/4052844 Asp.net中GridView使用详解 效果图参考:http://hi.baidu.com/hello%5Fworld%5Fws/album/asp%2Enet中以gv开头的图片 l         GridView无代码分页排序 l         GridView选中,编辑,取消,删除 l         GridView正反双向排序 l         GridVi

CSS 中z-index全解析(摘自阿里西西)

z-index全解析 Z-index属性决定了一个HTML元素的层叠级别.元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言.一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶部.这个层叠顺序沿着垂直的线轴被呈现. 在一个HTML页面中,自然的层叠顺序(也就是元素在Z轴上的顺序)是由很多因素决定的: 具有负值的stacking contexts(层叠环境)元素,按照出现的先后顺序排列(越靠后层级越靠上); 没有被定位,没有浮动的块级元素,按照出现的先后顺序排列; 没有被定

《在WebView中如何让JS与Java安全地互相调用》核心JS全解析

1.说明: <[在WebView中如何让JS与Java安全地互相调用](http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/)>核心JS全解析 2. 核心JS解析如下,欢迎拍砖!!! javascript: (function(win) {     console.log("HostApp initialization begin");     //win.HostApp对象     var 

Gson全解析(中)-TypeAdapter的使用

TypeAdapter介绍 前面的Gson全解析(上)中我们理解并分别运用了JsonSerializer和JsonDeserializer进行JSON和java实体类之间的相互转化.这里利用TypeAdapter来更加高效的完成这个需求. 之前在上一篇文中提到的JsonSerializer和JsonDeserializer解析的时候都利用到了一个中间件-JsonElement,比如下方的序列化过程.可以看到我们在把Java对象转化为JSON字符串的时候都会用到这个中间件JsonElement J