标签:异步 HTTP 请求 处理 Http 处理程序 模块 设计
原文链接:http://www.cnblogs.com/stone_lv/p/4921217.html1. 概述
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或者扩展名来处理请求,用处理程序比较合适;如果需要处理过程中特定的事件,用模块比较合适。
转载于:https://www.cnblogs.com/stone_lv/p/4921217.html
标签:异步,HTTP,请求,处理,Http,处理程序,模块,设计 来源: https://blog.csdn.net/weixin_30211341/article/details/97367065
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。