最近学习WCF知识时看到有关IIS版本的知识,发现对HttpContext,HttpModule,HttpHandler的内容都不是很了解,这三个也是ASP.NET相对基础的内容,晚上特地花点时间针对HttpModule的内容进行补充,文中的理论知识都是从网上多方面整理,最后的实例是本人所写的两个小实例,主要是针对HttpModule的运用;

一:关于HttpModule理论知识

1:HttpModule概述

HttpModule是实现了IHttpModule接口的程序集。一般来说,我们可以将Asp.Net中的事件分成三个级别,最顶层是 应用程序级事件、其次是页面级事件、最下面是控件级事件,事件的触发分别与 应用程序周期、页面周期、控件周期紧密相关。而 Http Module 的作用是与应用程序事件密切相关的。

注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。

2:HttpModules作用:

ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,或者截获的这个请求并做一些额外的工作,也或者终止请求等。HttpHandler处理完请求之后,我们可以再在相应的HttpModule中把请求处理的结果进行再次加工返回客户端。

3:Http模块可以向System.Web.HttpApplication对象注册下面一系列事件:

AcquireRequestState 当ASP.NET运行时准备好接收当前HTTP请求的对话状态的时候引发这个事件。

AuthenticateRequest 当ASP.NET 运行时准备验证用户身份的时候引发这个事件。

AuthorizeRequest 当ASP.NET运行时准备授权用户访问资源的时候引发这个事件。     

BeginRequest 当ASP.NET运行时接收到新的HTTP请求的时候引发这个事件。     

Disposed 当ASP.NET完成HTTP请求的处理过程时引发这个事件。     

EndRequest 把响应内容发送到客户端之前引发这个事件。     

Error 在处理HTTP请求的过程中出现未处理异常的时候引发这个事件。     

PostRequestHandlerExecute 在HTTP处理程序结束执行的时候引发这个事件。     

PreRequestHandlerExecute 在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序。

PreSendRequestContent 在ASP.NET把响应内容发送到客户端之前引发这个事件。这个事件允许我们在内容到达客户端之前改变响应内容。我们可以使用这个       事件给页面输出添加用于所有页面的内容。例如通用菜单、头信息或脚信息。     

PreSendRequestHeaders 在ASP.NET把HTTP响应头信息发送给客户端之前引发这个事件。在头信息到达客户端之前,这个事件允许我们改变它的内容。我们可以使用这个事件在头信息中添加cookie和自定义数据。     

ReleaseRequestState 当ASP.NET结束所搜有的请求处理程序执行的时候引发这个事件。     

ResolveRequestCache 我们引发这个事件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的。     

UpdateRequestCache 当ASP.NET完成了当前的HTTP请求的处理,并且输出内容已经准备好添加给输出缓冲的时候,引发这个事件。这依赖于Web应用程序的输出缓冲是如何设置的。

注意: BeginRequest和PreRequestHandlerExecute之间的事件是在服务器执行HttpHandler处理之前触发。
 
  PostRequestHandlerExecute和PreSendRequestContent之间的事件是在服务器执行Handler处理之后触发。

4:HttpModule生命周期示意图

5:HttpModule实现:

HTTP模块是实现了System.Web.IhttpModule接口的类。IHttpModule接口的声明:
  public interface IHttpModule
  {
  void Init (HttpApplication context);
  void Dispose ();
  }
Init 方法:系统初始化的时候自动调用,这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。
Dispose方法: 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。此方法一般无需编写代码。

二:HttpModule实例(分别用两个HttpModule来演示):

(1)第一个实例是演示实现站点所有页面的头部跟尾部都同时输出相同的内容:

步骤一:我们新建一个类让它继承接口IHttpModule;并让它实现两个事件,用于分别输出

using System.Web;

/// <summary>
///TestModule 的摘要说明
/// </summary>
public class TestModule:IHttpModule
{
public TestModule()
{
} public void Dispose()
{
throw new NotImplementedException();
} public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_StartRequest);
context.EndRequest += new EventHandler(context_EndRequest);
}
/// <summary>
/// 所有页面头部显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void context_StartRequest(object sender, EventArgs e)
{
HttpApplication ha = (HttpApplication)sender;
ha.Response.Write("页面加载前的内容");
}
/// <summary>
/// 所有页面尾部显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void context_EndRequest(object sender, EventArgs e)
{
HttpApplication ha = (HttpApplication)sender;
ha.Response.Write("内容加载后的内容");
}
}

步骤二:修改web.config 增加配置信息

    <httpModules>
<add name="TestModule" type="TestModule,App_Code"/>
</httpModules>

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

步骤三:查看运行效果(其中中间是我们当前页的内容):

(2)第二个实例是我们平时系统登录功能,实例把用户信息保存到Cookies中;在HttpModule进行统一判断,解决以前每个页面或者写个父类来进行判断的麻烦;

步骤一:首先我们同样新建一个类LoginModule继承自IHttpModule

using System.Web;

public class LoginModule:IHttpModule
{
public LoginModule()
{
} public void Dispose()
{
throw new NotImplementedException();
} 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.Segments[2].ToString(); //获得访问的页面
bool IsLogingPage = path.ToLower().Equals("login.aspx"); //比较是否是Login.aspx 是就不进入
if (!IsLogingPage)
{
var CookiesDemo = ha.Context.Request.Cookies["HttpDemo"];
if ( CookiesDemo== null)
{
ha.Context.Response.Redirect("Login.aspx");
}
}
}
}

步骤二:修改web.config

    <httpModules>
<add name="LoginModule" type="LoginModule,App_Code"/>
</httpModules>

步骤三:在登录页Login.aspx 实现一个针对Cookie的写入功能;

    protected void Button1_Click(object sender, EventArgs e)
{
HttpCookie ck = new HttpCookie("HttpDemo");
ck.Values.Add("UserID", "踏浪帅");
Response.SetCookie(ck);
Response.Redirect("Default.aspx");
}

步骤四:在首页Default.aspx 实现一个清除Cookie的功能,达到一个退出的功能

    protected void Button1_Click(object sender, EventArgs e)
{
ClearCookie("HttpDemo");
Server.Transfer("Login.aspx");
} public static void ClearCookie(string cookiename)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiename];
if (cookie != null)
{
cookie.Expires = DateTime.Now.AddYears(-3);
HttpContext.Current.Response.Cookies.Add(cookie);
}
}

效果:当没有在Login.aspx实现登录(写入Cookie)而直接访问首页Default.aspx时系统会自动跳转到Login.aspx;

希望本文对您有帮助,感谢您的阅读;[源代码下载]

 
 
 
标签: ASP.NET基础

ASP.NET基础之HttpModule学习的更多相关文章

  1. ASP.NET基础之HttpHandler学习

    ASP.NET基础之HttpHandler学习 经过前两篇[ASP.NET基础之HttpModule学习]和[ASP.NET基础之HttpContext学习]文章的学习我们对ASP.NET的基础内容有 ...

  2. (转)ASP.NET基础之HttpHandler学习

    原文地址:http://www.cnblogs.com/wujy/archive/2013/08/18/3266009.html 经过前两篇[ASP.NET基础之HttpModule学习]和[ASP. ...

  3. ASP.NET基础之HttpContext学习

    一:HttpContext理论知识: 1:HttpContext类它对Request.Respose.Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用:为继承 IHttpMod ...

  4. ASP.NET基础之HttpModule 、HttpContext、 HttpHandler

    http://www.cnblogs.com/wujy/p/3261141.html http://www.cnblogs.com/wujy/p/3264475.html http://www.cnb ...

  5. (转)asp.net基础-HttpModule

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...

  6. ASP.NET三剑客 HttpApplication HttpModule HttpHandler 解析

    我们都知道,ASP.Net运行时环境中处理请求是通过一系列对象来完成的,包含HttpApplication,HttpModule, HttpHandler.之所以将这三个对象称之为ASP.NET三剑客 ...

  7. Asp.Net MVC4 + Oracle + EasyUI 学习 序章

    Asp.Net MVC4 + Oracle + EasyUI  序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1.  简 ...

  8. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

  9. ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

    在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...

随机推荐

  1. 编程算法 - 切割排序 代码(C)

    切割排序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 排序切割, 把一个数组分为, 大于k\小于k\等于k的三个部分. 能够使用高速排序的Parti ...

  2. unicode编码和中国的相互转换

    如果你的原始文件1.properties(该文件的编码中国).要转换unicode的 在cmd通过进入你在哪里在这种类型的文件夹: native2ascii -encoding gb2312 1.pr ...

  3. JS开发调试

    开发调试工具   页面制作之开发调试工具(1) 开发工具介绍 开发工具一般分为两种类型:文本编辑器和集成开发环境(IDE) 常用的文本编辑器:Sublime Text.Notepad++.EditPl ...

  4. c# 替换非法字符

    保存文件的时候,文件名不允许非法字符. public string ReplaceSpecialCharacter(string str)        {            List<ch ...

  5. sql server int 列 NULLIF,isnull 判断是0还是1 ,如果是0就变成1

    SELECT ISNULL(NULLIF(col1,0),1) ISNULL:  第一个表达式 是 null 返回 第二个表达式,否则 返回 第一个 , ISNULL(表达式1,表达式2) if(表达 ...

  6. NSNotification、delegate和KVO的区别

    1.效率:delegate比nsnotification高.2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegat ...

  7. 谈论quick-cocos2d-x和cocos2d-x lua了解差异

    之前说,我把这个两个词区别.经过太长时间.当然,反击的麻烦.quick-cocos2d-x它提到quick,cocos2d-x lua姑且称为本地lua对. 我认为,首先与这两个小的朋友接触会跟着或多 ...

  8. Monkey源码分析之事件注入

    本系列的上一篇文章<Monkey源码分析之事件源>中我们描述了monkey是怎么从事件源取得命令,然后将命令转换成事件放到事件队列里面的,但是到现在位置我们还没有了解monkey里面的事件 ...

  9. Android设备连接Unity Profiler性能分析器

    Unity提供两种方式让Developer的Android设备连接Profiler进行性能分析: 1.通过wifi,Android设备和计算机处于同一个Wlan中. 2.通过USB ADB 普通情况我 ...

  10. 转载:善待Redis中的数据

    Redis是我们数据的保管者,我们可以随时存随时取,大的小的,重要的不重要的,它都毫无怨言的帮我们保存着,甚至有些时候,我们变得很懒,存东西进去的时候顺便还贴张纸:"过了一个星期就帮我扔了吧 ...