第七章 设计程序架构 之 设计HTTP模块和处理程序
1. 概述
HTTP模块和处理程序,可以让程序员直接跟HTTP请求交互。
本章内容包括 实现同步和异步模块及处理程序以及在IIS中如何选择模块和处理程序。
2. 主要内容
2.1 实现同步和异步模块及处理程序
模块(Module)在处理程序执行操作之前或者之后被调用,开发人员可以藉此来操作每一次请求操作。
创建Http模块需要实现 System.Web.IHttpModule 接口,它包含两个方法: void Init(HttpApplication) 和 void方法 Dispose。
System.Web.HttpApplication 包含 22 个事件,可供模块根据需求去灵活操作。
Web.Config中的httpModule节点可以用来在程序中配置http模块。
一般的程序处理流程是:验证、URL映射、一系列事件、处理程序、一系列事件。
Global.asax文件的核心功能就是处理应用程序事件。
不同于模块,只有一个处理程序被用来处理一个请求。处理程序必须实现IHttpHandler接口。
ASP.NET4.5允许同时编写模块和处理程序来处理异步请求。
private async Task ScrapePage(object caller, EventArgs e)
{
WebClient webClient = new WebClient();
var downloadresult = await webClient.DownloadStringTaskAsync("http://www.msn.com");
} public void Init(HttpApplication context)
{
EventHandlerTaskAsyncHelper helper =
new EventHandlerTaskAsyncHelper(ScrapePage);
context.AddOnPostAuthorizeRequestAsync(
helper.BeginEventHandler, helper.EndEventHandler);
}
*使用同步模块,主线程处理整个请求,包括处理程序和模块。同一时间只能处理一个请求,而且如果当前出现数据库错误或者I/O错误,整个程序都会受影响。
通过实现HttpTaskAsyncHandler,可以方便的实现异步处理。
public class NewAsyncHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
WebClient webClient = new WebClient();
var downloadresult = await
webClient.DownloadStringTaskAsync("http://www.msn.com");
}
}
2.2 在IIS中选择使用模块还是处理程序
Http处理程序根据请求文件的扩展名来判断处理方式,而Http模块是基于事件的处理方式。
抉择的依据是你需要 根据Url或者扩展名来处理请求 还是 根据一系列的规则来处理请求。
如果需要根据URL,那就用Http处理程序。如果要实现一个事件驱动的平台,那就用Http模块。
3. 总结
① HTTP模块和处理程序可以插入到IIS的请求处理流程中。
② 同步模块包含一个init方法,可以用来给附加到请求过程中的事件设置处理程序。
③ 异步模块稍微复杂一些,但是使用async、await以及Task 可以方便的处理耗时过程。
④ 处理程序可以根据特定的URL/extension来处理请求。可以同步也可以异步,取决于其扩展的基类。
⑤ 如果需要根据特定的URL或者扩展名来处理请求,用处理程序比较合适;如果需要处理过程中特定的事件,用模块比较合适。
第七章 设计程序架构 之 设计HTTP模块和处理程序的更多相关文章
- 第六章 设计程序架构 之 设计实现WebSocket策略
1. 概述 传统网页的通信方式是请求-响应模式,每次请求-响应都是新的连接.连接的建立和断开也是需要消耗资源的. WebSocket是基于TCP协议,实现单个连接上的双向通信. 本章内容包括: 异步读 ...
- 第三章 设计程序架构 之 设计实现Windows Azure 角色生命周期
1. 概述 Windows Azure 是微软的云计算平台.用于 在微软数据中心 通过全局网络 生成.发布和管理应用程序. 本章内容包括 startup tasks 以及 实现 Start, Run ...
- 第七章、Ajango自带auth模块
目录 第七章.Ajango自带auth模块 一.什么是auth auth是django自带的用户认证模块 二.auth模块的常用方法 三.拓展默认的auth_user表 第七章.Ajango自带aut ...
- 数据库原理 第七章 数据库设计和ER模型
第七章讲述一个E-R设计如何转换成一个关系模式的集合以及如何在该设计中找到某些约束. 1.概念设计定义了数据库中表示的实体.实体的属性.实体之间的联系,以及实体和联系上的约束 在设计一个数据库模型的时 ...
- C++ Primer Plus学习:第七章
C++入门第七章:函数-C++的编程模块 函数的基本知识 要使用C++函数,必须完成如下工作: 提供函数定义 提供函数原型 调用函数 库函数是已经定义和编译好的函数,可使用标准库头文件提供原型. 定义 ...
- MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化
第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...
- MySQL性能调优与架构设计——第2章 MySQL架构组成
第2章 MySQL架构组成 前言 麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成, ...
- 《Linux内核设计与实现》第七章读书笔记
第七章.中断和中断处理 7.1中断 中断使得硬件得以发出通知给处理器.中断随时可以产生,内核随时可能因为新来到的中断而被打断. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志.操作系统给 ...
- Laxcus大数据管理系统2.0(9)- 第七章 分布任务组件
第七章 分布任务组件 Laxcus 2.0版本的分布任务组件,是在1.x版本的基础上,重新整合中间件和分布计算技术,按照新增加的功能,设计的一套新的.分布状态下运行的数据计算组件和数据构建组件,以及依 ...
随机推荐
- Windows服务的快速搭建与调试(C#图解)
Windows服务的快速搭建与调试(C#图解) 目录 一.什么是Windows 服务? 二.创建Windows 服务与安装/卸载批处理. 三.调试Windows 服务. 正文 一.什么是Windo ...
- ORA-12547: TNS:lost contact
碰到这个ORA-12547: TNS:lost contact的问题,翻了很多资料和METALINK,总结了一下原因: 1 是由于rpm包没有安装,对于我们的生产环境,此包是安装的. admin@p1 ...
- BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- Intellij IDEA 弹窗License activation 报 this license BIG3CLIK6F has been cancelled 错误的解决。
this license BIG3CLIK6F has been cancelled 具体如下: 对,没错,这个激活码本来可以使用到2018年的,但是,忽然间就不能用了.经查询吧. 还得修改个系统配置 ...
- eclipse 查找controller
一.打开eclipse: 二.同时按住Ctrl + Shift + R ; 弹出框如下: 在红色输入框内输入controller 名字即可. 查找控制器里面的方法:Ctrl + O
- Boost-ioservices介绍
IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...
- 1.6 Hive配置metastore
一.配置 1.配置文件 #创建配置文件 [root@hadoop-senior ~]# cd /opt/modules/hive-0.13.1/conf/ [root@hadoop-senior co ...
- c/c++面试45-50之字符串
45 使用库函数将数字转换为字符串,下面是常用库函数 (1) itoa():将整型转换为字符串 (2)ltoa():将长整形转换为字符串 (3)gcvt():将浮点转换为字符串 46 不使用库函数将整 ...
- shell脚本函数与数组
前言 之前写过一篇关于shell脚本流程控制总结,这次继续写关于shell脚本的问题.本篇文章主要包含shell脚本中的函数以及数组的用法介绍.同时也涵盖了一些字符串处理以及shell脚本比较使用的小 ...
- 面试lua笔试题各种坑
替换字符串"abcdefgh" 中的"abc"为"ddc" local str ="abcdefgh"; b = str ...