一起谈.NET技术,ASP.NET 请求处理流程

  HTTP处理流程图

  以上流程的一些概念解释:

  1.http.sys

  是一个位于Win2003和WinXP SP2中的操作系统核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。

  温馨提示:如果用户不慎删除了该驱动文件,不用担心,该驱动会在下次系统启动时重建。是一个删不掉的系统核心组件!实用程序结束该驱动,该驱动也会马上重新创建(只有粉碎文件才不能马上重建,但粉碎后,下次启动会重建)。

  微软在Windows 2003 Server里引进了新的HTTP API和kernel mode driver Http.sys,目的是使基于Http服务的程序更有效率。这个改变的直接收益者就是IIS 6.0和ASP.NET。

  其实在Windows XP安装SP2后,Http.sys已经出现在系统里了,但事实上,操作系统并没有真的使用这个内核级驱动,而XP上自带的IIS 5.1也没有使用HTTP API。

  新的HTTP API里最核心的变化都封装在Http.sys这个kernel mode driver里了。在此之前,基于HTTP协议的程序都是在User mode下运行的,而且必须自己处理诸如软件中断、context switch、线程调度等等问题,并且往往无法自由接触系统资源。过去,HTTP服务器,如IIS, Apache等都是利用Winsock API来创建一个User mode下的network listener。Network listener通常独自(i.e.: per application or per thread basis)占用一个IP端口。通俗点说,就是在同一时间只有一个应用程序可以监听一个端口,这在有些时候是一个不太令人舒服的限制。

  新的Http.sys带来的好处大致有如下一些:

  1. 缓存 - 静态的内容现在被缓存于内核模式下,这使服务响应速度更快

  2. 记录 (Log)-IIS的log功能更快且标准化了

  3. 带宽控制 - greater scalability control and throttling

  4. 可靠性 - 所有的服务请求会在Http.sys里暂存入队列,而不是由服务程序本身来处理,这样,即使服务程序重启,尚未被处理的请求也不会丢失了

  5. IP端口重用 - 现在,只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了。

  2.应用程序池

  应用池即应用程序池:
  在Microsoft IIS6中引入了应用程序池,这是微软的一个全新概念:应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产生的问题的影响。 Windows 2003同时支持两种工作模式,默认为ISS 6.0工作进程隔离模式。工作进程隔离模式防止一个应用程序或站点停止了而影响另一个应用程序或站点,大大增强了IIS的可靠性。那么如何设置两种工作模式呢?
  启动IIS管理器,右击网站,选择“属性”,打开属性对话框。在IIS 6.0工作进程隔离模式下,所有的应用程序代码都在隔离环境中运行,它们是如何进行隔离的呢?Windows 2003新增了应用程序池,工作进程隔离模式允许客户创建多个应用程序池,每个应用程序池都可以有不同的配置。因为这些应用程序池直接从内核(而非WWW 服务)接收它们的请求,所以性能和可靠性得到了增强。要隔离运行在同一台计算机上但属于不同网站的Web应用程序,需要为每个网站创建单独的应用程序池。
创建应用程序池
  在IIS管理器中,打开本地计算机,右键单击“应用程序池”,选择新建“应用程序池” (必须在工作进程隔离模式下才能建立应用程序池) 。“应用程序池名称”框中,输入新的应用程序池名称。如果在“应用程序池 ID”框中出现的 ID (如:AppPool #1)不是您想要的,可进行重命名。如果您单击了“将现有应用程序池作为模板”,请在“应用程序池名称”框中右键单击想要用来作为模板的应用程序池。最后单击[确定]。
指派应用程序池
  在 IIS 管理器中,右键单击您要为其指派应用程序池的应用程序,然后单击“属性”。 单击“主目录”选项卡,确认您正在指派的目录或虚拟目录的“应用程序名”是否已被填写。如果“应用程序名”框尚未被填写,请单击“创建”,然后输入名称。
  在“应用程序池”列表框中,选择您想要为其指派的应用程序池的名称。最后单击[确定]。

   3.aspnet_isapi.dll

  这个文件是asp.net的处理文件,用于处理asp.net在iis中注册过扩展名的文件比如默认的.aspx文件注册到aspnet_isapi.dll,这样用户访问.aspx文件时,服务器自动调用aspnet_isapi.dll来处理这个文件.

  这个DLL是asp.net底层的一个类库,这是它的介绍: 当客户端向web服务器请求一个*.aspx的页面文件时,同asp类似,这个http请求也会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。

  4.CLR

  http://developer.51cto.com/art/200910/158022.htm

  http://developer.51cto.com/art/200909/152551.htm

  5.AppDomain

  http://www.cnblogs.com/chorrysky/archive/2008/07/16/1244089.html

  6.ISAPIRuntime

  管理 .NET Framework 中的 HttpWorkerRequest (此抽象类定义由 ASP.NET 托管代码用于处理请求的基本辅助方法和枚举)对象。

 

-----------------------------------------------------------------------------------------------------------------------------

  当第一个请求到达时的动作如下图所示:


   初始化所有核心应用程序对象之后,将通过创建 HttpApplication 类的实例启动应用程序。如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。

  每次http请求都会有一个HttpApplication类型的对象来管理这次请求的过程。

  为每次http请求创建一个HttpContext对象,此对象在整个Http处理过程中都是可访问的。

  HttpApplication对象负责装配出整个“HTTP请求处理管线(HTTP Pipeline)”,这相当于一条加工流水线,让HttpContext对象在这条线上过一遍。

  HttpContext对象经过流水线的不同部分时,HttpApplication对象会先后激发出一连串的事件。HTTP模块(HTTP Module)可以响应这些事件,在此事件响应代码中可以对HttpContext对象进行“加工和处理”。

  HTTP模块可以看成是“生产流水线”中的工人。

  HTTP模块对象是在HttpApplication对象的InitModules()方法中被创建的,创建时会调用其init方法,我们一般在HTTP模块对象Init()方法中书写代码对HttpApplication对象的事件进行注册。

 

  在流水线的中部(处理完了相关的事件),HttpContext对象被最终的Page对象所接收(这就是为何可以在ASP.NET页面中通过Page类定义的Context属性访问HttpContext对象的原因)。

  每个被访问的ASP.NET页面都会被转换为一个“派生自Page类的页面类”

  Page类实现了IHttpHandler接口,此接口定义了一个ProcessRequest()方法。

  ASP.NET页面类生成以后被自动编译为程序集,然后其ProcessRequest()方法被自动调用。ProcessRequest()方法的执行结果再次被HttpContext对象所承载,控制又转回到“HTTP请求处理流水线”中,HttpApplication对象继续激发后继的事件。这时,如果还有特定的HTTP模块响应这些事件,则它们会被自动调用。

  HttpContext对象带着最后的处理结果来到了“HTTP请求处理管线”的未端,其信息被取出来,再次以aspnet_isapi.dll为桥梁传送给工作者进程。工作者进程再将HTTP请求的处理结果转给HTTP.SYS,由它负责将结果返回给浏览器。

我们所写的那些页面代码,以及那一套复杂的页面生命周期,都是整个asp.net周期中的一部分,所有IhttpHandler的操作,都是在Application的PreRequestHandlerExecute 事件和PostRequestHandlerExecute 事件之间完成的,IHttpHandler中的操作都是页面级别的操作,他们不能跨出页面这个范。

  在应用程序级别的操作,应该使用IHttpModule。

  要区分开HttpApplication和HttpApplicationState

  HttpApplicationState是整个应用程序唯一的。
  而HttpApplication则不是唯一的。

  你在页面中写的Application[“key”] = “”value; 这个Application其实是HttpApplicationState

  每一次请求都由一个HttpApplication对象来处理,在处理过程中,这个对象不能再处理其他请求,并发访问时,会为不同访问分配不同HttpApplication对象。

  HttpApplicationFactory对象负责管理一个HttpApplication对象池,当有HTTP请求到来时,如果池中还有可用的   HttpApplication对象,则分配之,否则,创建一个新的HttpApplication对象。请求完毕后,HttpApplication会被回收以供再次使用。

  每当新的HttpApplication对象创建时,都会根据配置创建新的Ihttpmodule对象,新的IHttpModule对象被创建时,其init方法就会被执行。

 

  HttpApplication在不同处理阶段触发的事件列表

  1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest脚本侵入概述

  2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。

  3. 引发 BeginRequest 事件。

  4. 引发 AuthenticateRequest 事件。

  5. 引发 PostAuthenticateRequest 事件。

  6. 引发 AuthorizeRequest 事件。

  7. 引发 PostAuthorizeRequest 事件。

  8. 引发 ResolveRequestCache 事件。

  9. 引发 PostResolveRequestCache 事件。

  10. 根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。

  11. 引发 PostMapRequestHandler 事件。

  12. 引发 AcquireRequestState 事件。(加载初始化Session时候触发)

  13. 引发 PostAcquireRequestState 事件。

  14. 引发 PreRequestHandlerExecute 事件。(在HTTP请求送入HttpHandler之前触发)

  15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. 引发 PostRequestHandlerExecute 事件。(在HTTP请求送入HttpHandler之后触发)

  17. 引发 ReleaseRequestState 事件。(存储Session状态的时候触发)

  18. 引发 PostReleaseRequestState 事件。

  19. 如果定义了 Filter 属性,则执行响应筛选。

  20. 引发 UpdateRequestCache 事件。(更新缓存信息的时候触发)

  21. 引发 PostUpdateRequestCache 事件。

  22. 引发 EndRequest 事件。

  其他

  通过使用命名约定 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 文件中将应用程序事件自动绑定到处理程序。这与将 ASP.NET 页方法自动绑定到事件(如页的 Page_Load 事件)的方法类似。

  如果文件扩展名尚未映射到 ASP.NET,则 ASP.NET 将不会接收该请求。对于使用 ASP.NET 身份验证的应用程序,理解这一点非常重要。例如,由于 .htm 文件通常没有映射到 ASP.NET,因此 ASP.NET 将不会对 .htm 文件请求执行身份验证或授权检查。因此,即使文件仅包含静态内容,如果希望 ASP.NET 检查身份验证,也应使用映射到 ASP.NET 的文件扩展名创建该文件,如采用文件扩展名 .aspx。

  如果要创建服务于特定文件扩展名的自定义处理程序,必须在 IIS 中将该扩展名映射到 ASP.NET,还必须在应用程序的 Web.config 文件中注册该处理程序。有关更多信息,请参见 HTTP 处理程序介绍

  在AcquireRequestState事件(包含该事件) 到 PostRequestHandlerExecute事件(不包含该事件)之前这段时间里,Session都是可用的。Httphandler的ProcessRequest方法也是在这段时间内被调用的,所以用在页面中可以用Session[“key”]来访问Session。

  其他参考:http://www.cnblogs.com/stg609/articles/1224943.html

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162661.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链接在HTML的英文,英文:A链接标记ie下会自动补全href_HTML/Xhtml_网页制作

英文:A链接标记ie下会自动补全href.Whilst working on the Ajax Link Tracker and MapSurface I have come across an inconsistency in how the href attribute is retrieved using DOM Scripting.The href attribute is different to other element attributes in that the v…

python实现文件加密

前言: 想实现批量文件加密,可惜批量。展时没有思路 0x1 没有加密前的图片 加密后!!! !!!打不开了 0x02: 代码 import hashlibdef get_sha1(f):xdopen(E:/1.txt,rb).read() #以读二进…

教徒计划出品:升级ESXI41-ESXI5

这个文档是教徒计划“教徒第一期”学员做的升级ESX41到ESXI5的资料,以后教徒计划学员做的资料共享时,我都会打上“教徒计划出品”字样,这样有别于“现任明教教主”出品。这样能够确认是谁主导做的这个事情。“教徒计划”这个平台能够给安全CC…

html是以一种通用的方法来,c++ 有一种通用的方法来使函数模板适应为多态函数对象吗?...

我有一些功能模板,例如template void foo(T);template void bar(T);// others我需要将每一个传递给一种算法,它将被称为各种类型的算法.template void some_algorithm(F f){// call f with argument of type int// call f with argument of type SomeClass// etc.}我不能传递我…

百度2011大会见闻:百度开始推出耀主页

9月2号是百度大会的日子&#xff0c;之前通过51CTO注册&#xff0c;获得了参会资格&#xff0c;感谢51CTO带来的机会&#xff0c;可以有幸到现场观看到百度总裁李彦宏的精彩演讲。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />…

asp.net core中使用log4net

和之前的ASP.NET MVC中的使用LOG4NET的方法有些不同&#xff0c;这里先记录一下&#xff0c;使用步骤如下 &#xff1a; 1. 建立 ASP.NET CORE项目中&#xff0c;NUGET中搜索log4net后下载安装 2. 根目录建立 log4net.config文件&#xff0c;内容如下&#xff1a; <?xml ve…

2013电大计算机应用基础试题及答案,[2017年电大]电大2013年计算机应用基础试题及答案[呕心沥血整理].doc...

[2017年电大]电大2013年计算机应用基础试题及答案[呕心沥血整理]计算机应用基础复习资料一、单选题1、当前的计算机一般被认为是第四代计算机&#xff0c;它所采用的逻辑元件是______。答案&#xff1a; DA&#xff1a;晶体管 B&#xff1a;集成电路 C&#xff1a;电子管 D&…

由于远程桌面服务当前正忙|VDI无法连接

VDI 无法连接&#xff0c;“由于远程桌面服务当前正忙”。Win2008 R2 DC RDVH RDCB RDWA &#xff0c;然后为用户demo配置了个人虚拟机&#xff08;XP SP3&#xff09;&#xff0c;当用户登录rdwa.abc.com/rdweb &#xff0c;访问“我的桌面”时一段时间后报错 “由于远程桌…

寒假作业01

1.对大一上学期的总结&#xff1a; 用一句很经典的话来说&#xff0c;大学生活与高中生活不同就在于高中忙着做作业是为了有时间去做其他的事&#xff0c;而在大学&#xff0c;得忙着做完其他事情才有时间去做作业。因为不仅要处理好学习内的事情&#xff0c;还要花心思在课余活…

单招计算机英语面试口语,英语面试口语对话技巧:教育背景

2021年高职单招升学一对一咨询高职单招袁老师:16623303056(微信)英语面试口语对话技巧:教育背景一、常见的英语面试对话1a&#xff1a;can you read and write english and german?你能用英语和德语读写吗&#xff1f;b&#xff1a;no, im proficient in both written and spo…

C代码中的命名方式总结和改进

宏全部使用大写字母--------宏大写结构体名字全部使用typedef&#xff0c;typedef之后的名字为大写-------结构体别名大写函数名全部使用小写字母&#xff0c;单词之间使用下划线分割-------函数名小写&#xff0c;单词之间下划线&#xff08;1&#xff09;函数名第一个单词全小…

linux 安装软件的几种方法

一、 解析Linux应用软件安装包&#xff1a;通常Linux应用软件的安装包有三种&#xff1a;1&#xff09; tar包&#xff0c;如software-1.2.3-1.tar.gz。它是使用UNIX系统的打包工具tar打包的。2&#xff09; rpm包&#xff0c;如software-1.2.3-1.i386.rpm。它是Redhat Linux提…

对计算机网络用户而言 掌握网络,计算机网络的特点

1、可靠性在一个网络系统中&#xff0c;当一台计算机出现故障时&#xff0c;可立即由系统中的另一台计算机来代替其完成所承担的任务。同样&#xff0c;当网络的一条链路出了故障时可选择其它的通信链路进行连接。2、高效性计算机网络系统摆脱了中心计算机控制结构数据传输的局…

Bootstrap-CSS:表格

ylbtech-Bootstrap-CSS&#xff1a;表格1.返回顶部 1、Bootstrap 表格 Bootstrap 提供了一个清晰的创建表格的布局。下表列出了 Bootstrap 支持的一些表格元素&#xff1a; 标签描述<table>为表格添加基础样式。<thead>表格标题行的容器元素&#xff08;<tr>…

Oracle找出需要建立索引的表

文章讨论的是本来应该建立索引而因为疏忽&#xff0c;或者考虑不周全而没有建立的情况 select distinct sp.OBJECT_NAME,round(ds.bytes/1024/1024,2) MB,num_rows,last_analyzed from v$sql_plan sp ,v$sqlarea sq,dba_segments ds,dba_tables dt where sq.ADDRESSsp.ADDRESS …

石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)

题目&#xff1a; 链接&#xff1a;https://www.nowcoder.com/acm/contest/76/A来源&#xff1a;牛客网 随着海上运输石油泄漏的问题&#xff0c;一个新的有利可图的行业正在诞生&#xff0c;那就是撇油行业。如今&#xff0c;在墨西哥湾漂浮的大量石油&#xff0c;吸引了许多商…

Struts1 处理接收参数插入到数据库之后呈乱码的问题解决

Struts处理接收参数乱码问题&#xff08;actionForm接受的参数发送至数据库成乱码&#xff09;的解决办法: 第一步&#xff1a; 新建一个类如&#xff1a;EncodingActionServlet 继承 ActionServlet 覆盖父类process()方法代码如下&#xff1a;package com.aptech.jb.epet.we…

计算机nit题百度云,计算机NIT应用基础试题

一、 填空题(25分)文章地址&#xff1a;https://www.llysc.cn/content/24-24873.html1、完整的计算机由硬件系统 和软件系统 两大部件组成的。3、存储器可分为内存储器 和外存储器 两类。4、微型计算机硬件系统一般应包括主机、键盘、鼠标和显示器 。5、通过鼠标的基本操作方法…

前端(2)CSS

css&#xff1a;Cascading Style Sheet 层叠样式表——修饰、美化网页&#xff0c;化妆师CSS优先级&#xff0c;即是指CSS样式在浏览器中被解析的先后顺序。行间样式 > 内嵌css样式 > 外链css样式&#xff08;在style之前引入&#xff09;如果外链css样式在style之后引入…

某计算机公司的库存管理,《管理系统中计算机应用》应用题数据流程图汇总题及参考答案...

《管理系统中计算机应用》应用题及参考答案——数据流程图1、教学管理的主要工作过程是&#xff1a;系办(公室)输入班级和教学时间&#xff0c;查看教学计划表&#xff0c;确定本学期教学任务&#xff1b;根据本学期教学任务&#xff0c;查看教师表&#xff0c;制作开课任务书和…