一、HttpApplication简介

在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication。

  HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的时候,HttpApplicationFactory通过工厂模式管理HttpApplication对象。在HttpApplicationFactory内部维护了一个HttpApplication对象池,使得被创建的HttpApplication对象可以被重复使用。但是,每一个HttpApplication对象每一次仅仅用于处理一个请求,这样就不需要考虑HttpApplication中多个请求并发的处理问题了。

  在HttpApplication中,利用.Net中的事件机制,通过在处理过程中依次发出的多个事件,将这个处理过程分解为多个步骤,这个处理机制通常我们称为处理管道。

HttpApplication对象是Asp.net中处理请求的重要对象,但是,这种类型的对象实例不是由程序员来创建,而是由Asp.net帮助我们创建。为了便于扩展处理,Asp.net暴露了大量的事件给程序员,这些事件按照固定的处理顺序依次触发,程序员通过编写事件处理方法就可以自定义每一个请求的扩展处理过程。也就是HttpApplication的19个标准事件。

HttpApplication的管道事件,提供了2中注册方式:

1.使用全局文件global.axax,使用简单

2.使用IHttpModule扩展接口方式注册

二、使用Global.axax 全局文件注册管道事件

这种方式易用,优先推荐。

示例:

         protected void Application_BeginRequest(object sender, EventArgs e)
{
Context.Response.Write("开始处理请求。。。。。。");
}
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
Context.Response.Write("验证请求。。。。。。");
}
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
Context.Response.Write("获取成功");
}
protected void Application_EndRequest(object sender, EventArgs e)
{
Context.Response.Write("结束请求");
}

注:Global.asax 的Application_Start事件中不能注册模块和管道处理,构造函数中也不推荐使用,因为调试时构造函数执行了2次

//注意:Application_Start事件中不能注册模块,会抛出异常
// 也不能注册模块的事件,因为不会触发
//HttpApplication.RegisterModule(typeof(TestTwo));
        //调试的时候构造执行了两次
//构造函数中注册的BeginRequest 会触发
public MvcApplication()
{
// this.BeginRequest += Begin;
number++;
}

三、扩展IHttpModule接口定义HttpModule类注册处理

1.IHttpModule定义如下:

    //
// 摘要:
// 向实现类提供模块初始化和处置事件。
public interface IHttpModule
{
//
// 摘要:
// 处置由实现 System.Web.IHttpModule 的模块使用的资源(内存除外)。
void Dispose();
//
// 摘要:
// 初始化模块,并使其为处理请求做好准备。
//
// 参数:
// context:
// 一个 System.Web.HttpApplication,它提供对 ASP.NET 应用程序内所有应用程序对象的公用的方法、属性和事件的访问
void Init(HttpApplication context);
}

2.实现示例:

public class TestTwo : IHttpModule
{
public void Dispose()
{
throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
//监听请求处理
context.BeginRequest += (sender, e) =>
{
LogHelper.LogHelper _log = new LogHelper.LogHelper();
_log.WriteLine("当前请求" + context.Request.Url.AbsoluteUri);
};
}
}

3.关于HttpModule 注册

在IIS早版本中使用WebConfig配置模块

<system.webServer>
<modules>
  <add name="ModuleExample" type="Samples.ModeleExample">
</modules>
</system.webServer>

在IIS和.Net 新版本中添加了PreApplicationStartMethodAttribute 注册方式

对应示例:

启动方法定义

    public class TestOne
{
/// <summary>
/// 程序启动时,PreApplicationStartMethod中指定的方法必须是公共静态的
/// </summary>
public static void Start()
{
LogHelper.LogHelper _log = new LogHelper.LogHelper();
_log.WriteLine("程序启动成功1"); //注册模块
HttpApplication.RegisterModule(typeof(TestTwo));
}
}

程序集加载注册:

//定义程序启动时处理方法
[assembly: PreApplicationStartMethod(typeof(TestOne), "Start")]

更多:

PreApplicationStartMethodAttribute程序启动扩展

Asp.Net 拦截请求自定义处理

Asp.Net 获取物理路径

Asp.Net 管道事件注册/HttpApplication事件注册的更多相关文章

  1. Asp.net自定义控件开发任我行(7)-注册自定义事件

    摘要 前面我们已经把嵌入资源讲完了,不知道大家有没有得到收益,本章主要讲自定义事件,也就是给TextBox注册一个点击事件. 引言 不知道道上的朋友有没有注意到TextBox控件没有点击事件,就连网上 ...

  2. ASP.NET 管道事件与HttpModule, HttpHandler简单理解 -摘自网络

    第一部分:转载自Artech  IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...

  3. Lind.DDD.Events事件总线~自动化注册

    回到目录 让大叔兴奋的自动化注册 对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它 ...

  4. 菜鸟学JS(四)——javascript为按钮注册回车事件(设置默认按钮)

    不得不说,在JS方面,自己真的是个不折不扣的菜鸟.对于JS以及一些JS框架如JQuery等JS框架,自己也只是处在简单应用的阶段,当然自己也在不断的学习当中,希望将来能跟大家分享更多JS方面的心得.今 ...

  5. 获取所有树叶子节点 注册添加事件 if ($(node).tree('isLeaf', node.target)) 是否叶子节点

    //获取所有树叶子节点 注册添加事件 if ($(node).tree('isLeaf', node.target)) 是否叶子节点 $(function () { $('.easyui-tree') ...

  6. jQuery-委托事件和on方法注册事件

    delegate注册委托事件 delegate--代理.委托 事件代理----事件最终不是由$("#first")执行,它只是代理元素 第一个参数:最终发生事件的元素 第二个参数: ...

  7. element-ui <el-input> 注册keyup事件,即键盘enter.

    <template> <!-- 需求:keyup事件一般用在input中,在input框中输入内容,用户点击键盘的enter,执行搜索 --> <div class=&q ...

  8. element-ui <el-input> 注册blur事件

    <template> <div class="demo"> <el-input placeholder="注册blur事件" v- ...

  9. 背水一战 Windows 10 (69) - 控件(控件基类): UIElement - Manipulate 手势处理, 路由事件的注册, 路由事件的冒泡, 命中测试的可见性

    [源码下载] 背水一战 Windows 10 (69) - 控件(控件基类): UIElement - Manipulate 手势处理, 路由事件的注册, 路由事件的冒泡, 命中测试的可见性 作者:w ...

随机推荐

  1. max 基础知识

    MDX基本语法 MD询语句的结构及语法 MDX查询示例 基本的MDX SELECT语句包含一SELELCT字句和一个FROM字句,以及一个可选的WHERE子句.如下 SELECT {[Measures ...

  2. PocketMoney

    PocketMoney( Money.pas/cpp/c)Description学校为了表彰tsoi的优异成绩, m个领导每人都决定给tsoi的一些人发一些小红包.于是n个Tsoier排成一排,等待着 ...

  3. Spring拦截器和过滤器

    什么是拦截器 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者 ...

  4. Qt代码创建分隔条

    我们在使用Qt时,会发现在使用UI界面时可以添加窗口分隔条,但我们使用纯代码时却没有分隔条的类函数.这时候我们就需要手动添加,添加方式和Qt自定义标签按钮一样,下面我直接写代码.如果不知道怎么添加的, ...

  5. eclipse launching workspace太慢的解决方法

    这几天eclipse调试Android项目的时候反应超慢,右下显示launching workspace就不怎么动了,今天终于卡的受不了了,在网上搜了写方法,设置了下总算好点了,现在把方法贴出来,跟大 ...

  6. 【BZOJ 4059】 (分治暴力|扫描线+线段树)

    4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 632  Solved: 22 ...

  7. hdu 5726 tetrahedron 立体几何

    tetrahedron/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Given four p ...

  8. pop3_用Java发送图文并茂的HTML邮件

    package com.syj; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.i ...

  9. Centos 安装Percona Toolkit工具集

    1.下载 下载地址:   https://www.percona.com/downloads/percona-toolkit/LATEST/ [root@bogon ~]# wget https:// ...

  10. 使用CefSharp在.Net程序中嵌入Chrome浏览器(十)——独立文件夹部署

    CefSharp本身携带了一大堆文件,这些文件默认直接释放在exe文件底下,这种方式本身没有什么问题,但多了一大堆文件后不是很好看.本文这里就介绍一个方法,使得可以将CEF相关的文件部署到独立的文件夹 ...