Asp.net本质论之应用程序对象
| 主题 | 概要 |
|---|---|
| Asp.net | 应用程序对象 |
| 编辑 | 时间 |
| 新建 | 20171018 |
| 序号 | 参考资料 |
| 1 | Asp.net本质论 |
| 2 | https://msdn.microsoft.com/en-us/library/system.web.httpapplication(v=vs.110).aspx |
| 3 | https://msdn.microsoft.com/en-us/library/system.web.ihttpmodule(v=vs.110).aspx |
在上一篇ASP.net本质论之用控制台应用程序创建Asp.net服务器
中基本理清了服务器监听部分及怎么创建自己的应用程序域和处理程序。本篇对当请求到达后,asp.net如何处理的内容做一个学习总结。
针对每一次请求,ASP.net将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.net服务器的处理过程中传递所有需要的参数,在请求到达Asp.net服务器之后,这个对象将被创建出来,在一次请求处理之后,这个对象将被丢弃掉。HttpContext对象包括了HttpRequest类型的对象以表示请求参数,HttpResponse类型的对象以表示回应的处理对象,另外还有HttpServerUtility类型的对象等。
当HttpContext对象被创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication。
在ASP.net内部,HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的实例,HttpApplicationFactory通过工厂模式管理HttpApplication对象,在HttpApplicationFactory内部维护了一个HttpApplication对象池,使得被创建的HttpApplication对象可以被重复使用。
处理管道
所谓的处理管道,就是处理复杂问题的时候,将处理的过程分解为多个处理步骤,我们将这种经过多个步骤的处理方式称为处理管道。如下图所示:
这些管道步骤实际上是一系列的事件,MSDN
https://msdn.microsoft.com/en-us/library/system.web.httpapplication(v=vs.110).aspx
中详解了这些事件。程序员通过编写事件处理方法就可以自定义每一个请求的扩展处理过程。
那HttpApplication是怎么样定义这么多事件的呢?
通过继承System.ComponentModel.Component类,对于这个派生类所需要定义的每一个事件,在类中定义一个对应的作为key的对象,以后,通过这个key对象来访问由Events集合管理的事件。
下面的代码演示了一个Mini的处理管道,没有HttpApplication这么多事件,但定义过程类似:
定义:
namespace Aspnet.Pipe
{
public class ProcessPipeline:System.ComponentModel.Component
{
private static readonly object startEvent = new object();
private static readonly object preProcessEvent = new object();
private static readonly object postProcessEvent = new object();
private static readonly object endEvent = new object();
public event EventHandler StartEvent
{
add { this.Events.AddHandler(startEvent, value); }
remove { this.Events.RemoveHandler(startEvent, value); }
}
public event EventHandler PreProcessEvent
{
add { this.Events.AddHandler(preProcessEvent, value); }
remove { this.Events.RemoveHandler(preProcessEvent, value); }
}
public event EventHandler PostProcessEvent
{
add { this.Events.AddHandler(postProcessEvent, value); }
remove { this.Events.RemoveHandler(postProcessEvent, value); }
}
public event EventHandler EndEvent
{
add { this.Events.AddHandler(endEvent, value); }
remove { this.Events.RemoveHandler(endEvent, value); }
}
protected void OnStartProcess(EventArgs e)
{
if(this.Events[startEvent]!=null)
{
(this.Events[startEvent] as EventHandler)(this,e);
}
}
protected void OnPreProcess(EventArgs e)
{
if (this.Events[preProcessEvent] != null)
{
(this.Events[preProcessEvent] as EventHandler)(this, e);
}
}
protected void OnPostProcess(EventArgs e)
{
if (this.Events[postProcessEvent] != null)
{
(this.Events[postProcessEvent] as EventHandler)(this, e);
}
}
protected void OnEndEvent(EventArgs e)
{
if (this.Events[endEvent] != null)
{
(this.Events[endEvent] as EventHandler)(this, e);
}
}
public void Process()
{
Console.WriteLine("开始处理....");
this.OnStartProcess(EventArgs.Empty);
Console.WriteLine("准备处理....");
this.OnPreProcess(EventArgs.Empty);
Console.WriteLine("正在处理....");
this.OnPostProcess(EventArgs.Empty);
Console.WriteLine("处理完成....");
this.OnEndEvent(EventArgs.Empty);
}
}
}
使用:
public static void Main()
{
ProcessPipeline process = new ProcessPipeline();
process.StartEvent += new EventHandler(startProcessHandler);
process.PreProcessEvent += new EventHandler(preProcessHandler);
process.PostProcessEvent += new EventHandler(postProcessHandler);
process.EndEvent += new EventHandler(endProcessHandler);
process.Process();
}
public static void startProcessHandler(object sender,EventArgs e)
{
Console.WriteLine("开始处理的事件处理。。。。。");
}
public static void preProcessHandler(object sender, EventArgs e)
{
Console.WriteLine("预处理的事件处理。。。。。");
}
public static void postProcessHandler(object sender, EventArgs e)
{
Console.WriteLine("处理后的事件处理。。。。。");
}
public static void endProcessHandler(object sender, EventArgs e)
{
Console.WriteLine("处理完成的事件处理。。。。。");
}
结果:
处理HttpApplication的事件
程序员对HttpApplication的事件进行处理过程扩展,关键点是如何引用这个HttpApplication对象,因为HttpApplication对象是由Asp.net基础架构来创建和维护的。
在ASP.net中提供了两种方式:IHttpModule方式和global.asax方式。
通过IHttpModule创建HttpApplication事件处理程序
第一步:实现IHttpModule接口,接口说明参照MSDN:
https://msdn.microsoft.com/en-us/library/system.web.ihttpmodule(v=vs.110).aspx
并参加MSDN上的例子:
https://msdn.microsoft.com/en-us/library/ms227673(v=vs.110).aspx
第二步:注册HttpModule
在Asp.net中,实现IHttpModule接口只是实现HttpModule的第一步,在Asp.net中所使用的HttpModule还必须在网站配置文件中进行注册才能真正生效,并在Asp.net中使用。
在网站的配置文件web.config中,system.web配置元素的子元素httpModules用来配置网站所使用的HttpModule;httpModules的子元素用来增加一个新的HttpModule,clear将清除前面注册的所有HttpModule。
Add元素有两个必选的属性name和type,简介如下:
Name:表示这个HttpModule在程序中的名字,作为索引器的唯一标识。
Type:表示HttpModule对象的类型名,asp.net网站可以使用这个类型名,通过反射来动态创建HttpModule对象。如果不在同一个命名空间,要加上程序集名称,并用逗号分隔。
通过global.asax创建HttpApplication事件处理
在global.asax中,针对HttpApplication的事件处理,可以通过定义特殊命名的方法来实现。首先,这些方法必须符合System.EventHandler,因为所有的HttpApplication管道事件都使用这个委托定义。第二,方法的作用域必须是public。第三,方法的命名格式必须如下:
Application_注册的事件名称。按照这种命名方法定义在global.asax中的方法将被自动注册到对应的事件中。
智能推荐
ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新(仅适用于EF Core 3.0) 执行存储过程 定制模型绑定器 使用IIS Express和本地IIS 摘要 下载AspNetCore3.0_DataServices-75.8 KB 下载AspNet...
asp.net 集成测试_简化ASP.NET Core应用程序的功能和集成测试
asp.net 集成测试 In ASP.NET 2.1 (now in preview) there's apparently a new package called Microsoft.AspNetCore.Mvc.Testing that's meant to help streamline in-memory end-to-end testing of applications that ...
让你的ASP.NET Core应用程序更安全
让你的ASP.NET Core应用程序更安全 对于ASP.NET Core应用程序,除了提供认证和授权机制来保证服务的安全性,还需要考虑下面的一些安全因素: CSRF 强制HTTPS 安全的HTTP Headers CSRF ASP.NET Core通过AntiForgeryToken来阻止CSRF攻击,一般来说,当用户做表单提交的时候,表单中隐藏的token也会被提交到服务端,与此同时cooki...
冒泡排序,及改进方式,性能优化400%>>>附图解加源码
首先源码附上,源码中带有注释,看不懂没关系,源码后面附带图解,最后附上代码效率提升图 源码如下: 方案一:其实实现很简单,两层循环,每次内层迭代出最大的一个值,将其放入数组最后一个位置,外层循环的末端便往前移一位。其原理如下图 方案一代码块: 方案二:优化改进 仔细观察上面的图,我们不难发现当迭代到图下这样的情况时,其实已经全排序好了,但是我们还是需要对它进行1,2,3,4,5,6的迭代,这些情况...
css3常用选择器
先介绍一下基本选择器,如下几种 *:通配符。选择页面的所有元素 E:元素选择器。对页面的一些元素进行选择,如p,div,li等 .class:类选择器 #id:id选择器。一个Id在一个页面中只能选择,这是和类选择器的区别 E F:后代选择器。如ul li。选中ul下的li E>F:子元素选择器。如下,可以用 h1 > strong {color:red;}使h1的子元素strong变...
猜你喜欢
python is not set from command line or npm configuration
问题 猜测原因 python版本冲突 解决方案 去官网找到最新版本python 点击下载,注意记住你下载的目录,下载好以后,打开这个目录下的文件夹,Python310, 整个文件夹复制一下 在项目里运行npm config list --json 找到python的路径 我的是 C:\\Python27\\python.exe 说明项目里用的还是py...
Java8 Stream流操作
前言 我们常常需要将一个容器转化成另一个容器,或是对这个容器中的数据进行批量处理,这时使用Stream流可以大大减少我们的工作量。 1 Stream概述 Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。 那么什么是Stream? Stream将要处理的元素集合看作一种流,在流的过程中,借助St...
带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑
在Windows下进行C++的开发,不可避免的要与Windows的底层库进行交互,然而VS下的一项设置MT、MTd、MD和MDd却经常让人搞迷糊,相信不少人都被他坑过,特别是你工程使用了很多第三库的时候,及容易出现各种链接问题。看一下下面这个错误提示: LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined...
git 设置 gitignore 忽略 __pycache__
清除git缓存中的pycache 直接删掉硬盘上的文件 如果我想保留硬盘上的这个文件,而只删除版本管理中的文件,就需要加入--cached参数。 切换分支出现问题 尽管我已经删除了__pycache__,硬盘也没有了,但是切换分支的时候依然是会提示本地重写的情况。 提示:需要我在切换分支之前,提交一次更新。 提交了更新之后,再来尝试切换分支,如下: 成功了,说明当做了任何变更之后,切换分支前需要执...
人生苦短,我用Python(二)— 爬取会议网站 EasyChair Smart CFP
寒假留校帮学长写了个爬虫,抓取会议网站上一些CFP信息。想着把一些知识点、坑点记下来,一来做个小总结给工作收收尾,二是以后再遇到好从容应对。 这是我写的第二个比较完善的爬虫了,比第一个要简单许多,完全过程化的代码,而且easychair这个网站页面布局比较友好,适合python新手、前端小白入门练习。但这个网站反爬比较厉害,写爬虫的过程中就被ban了好几次…… 制定抓取...
