一、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. Angular快速学习笔记(3) -- 组件与模板

    1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性. 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表 ...

  2. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  3. 什么情况下,会用到fiddler或者charles?

    有的页面,比如设限制的html页面,比如原生页面,只能在手机APP里面查看,无法在电脑浏览器中打开查看,这时候,需要用fiddler抓包来查看返回数据,定位问题.

  4. android 滑动冲突

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 通过move事件的 拦截. 在滑动组件中,重写 在拦截触摸事件的时候  这个方法, 然后 ...

  5. XXX on tree

    %了发树上莫队 nlognsqrt(n) // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; in ...

  6. Prufer codes与Generalized Cayley's Formula

    Prufer序列 在一棵n个节点带标号树中,我们认为度数为1的点为叶子.n个点的树的Prufer序列是经过下面流程得到的一个长度为n-2的序列. 1.若当前树中只剩下两个点,退出,否则执行2. 2.找 ...

  7. LOJ.2863.[IOI2018]组合动作(交互)

    题目链接 通过两次可以先确定首字母.然后还剩下\(n-1\)位,之后每一位只有三种可能. 最简单的方法是每次确定一位,通过两次询问显然可以确定.但是只能一次询问. 首字母只会出现一次,即我们可以将串分 ...

  8. Hystrix简单介绍

    Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...

  9. Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 水题

    A. Vitya in the Countryside 题目连接: http://codeforces.com/contest/719/problem/A Description Every summ ...

  10. spring-boot parent变更为依赖方式

    原parent继承方式 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...