http的请求和响应过程2

简介:

 

书接上文,本篇为鄙人阅读各位前辈的文章,根据自己的理解拙记一下。。。。。。。。。

 

上文中最大化的概括了一次http请求和响应,本节就来分段详细分析

1、在客户端浏览器中输入网址之后是如何找到网站所在服务器

    客户端在浏览器中输入网址http://www.xxxxxx.edu.cn并提交之后,首先由DNS服务器找到网址所在服务器的IP,找到IP之后要判断IP是否在同一个子网络,如果在同一子网络,则直接向服务器发送数据包,如果不是同一子网络,将数据包发送到客户端所在子网络的网关,由网关找到服务器所在的网关,网关之间通过路由的方式发送,服务器所在网关接收到数据包之后再找到服务器所在位置,将数据包发送给服务器。

 

  上图中,1 号电脑要向 4 号电脑发送一个数据包。它先判断 4 号电脑是否在同一个子网络,结果发现不是(后文介绍判断方法),于是就把这个数据包发到网关A。网关A通过路由协议,发现 4 号电脑位于子网络B,又把数据包发给网关B,网关B再转发到 4 号电脑。

详细介绍请看http://kb.cnblogs.com/page/144577/ 。

2、iis服务器接收到请求之后

    什么是iis?

    IIS(Internet Infomation Server)是微软Web Server的一种,用来配置asp.net站点。IIS拥有自己的asp.net处理引擎来处理请求,因此当一个请求到达时,IIS接     收并处理,然后返回给客户端。

 

                           

  工作进程:

在iis中,工作进程(w3wp.exe)运行着asp.net应用程序,管理并响应所有的请求,asp.net所有的功能都运行在工作进程下,当请求到来时,工作进程会生成request和response相关信息。

  应用程序池:

应用程序池是工作进程的容器。通常用来隔开不同配置的工作进程,当一个程序出错或进程资源回收的时,其他池中的程序不受影响。

                            

    注:当一个应用程序池包含多个工作进程时,没叫做web garden

  

    如果我们看看iis 6 的结构,就会发现可以把他分为两部分

           内核模块(kernel model)

       用户模块(user model)

       内核模式是从iis 6.0被引入的,他包含一个叫做http.sys的文件,每当请求到来时,会首先触发该文件的响应。

      

http.sys负责将请求传入到响应的应用程序池,但是http.sys是如何知道应该传到那个应用程序池?当时不是随机的,没当创建一个应用程序池,该池的ID就会生成并在http.sys文件中注册,因此该文件就能确定将请求发往那个程序池。

      

        

  以上便是IIS处理请求的第一步。接着,我们来看一下请求如何从HTTP.SYS传入应用程序池。

   

  在iis用户模块(user model),通过WAS(web admin services)从http.sys接收请求,并传入应用程序池。

      

当应用程序池接收到请求之后,会传给工作进程(w3wp.exe),该进程检查请求的URL后缀,以确定加载那个ISAPI 扩展,然后将该请求传递给合适的 ISAPI 扩展。

ASP.NET 处理已映射到它上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。

即:当文件为上述后缀时,就要加载ASP.NET的ISAPI扩展(aspnet_isapi.dll)

    

      

一旦工作进程加载了aspnet_isapi.dll,就会构造一个HttpRuntime类(密封类,防止派生),该类是应用程序的入口,通过该类中的ProcessRequest()方法创建HttpContent类,(值得一说的是这时的请求会被包装在HttpWorkerRequest类中),进入ProcessRequest方法之后,内部触发一系列的方法,最终创建一个HttpContent实例(可通过HttpContent.Current获取到这个实例),且该实例会在整个生命周期内存活。   

之后HttpRuntime类会向HttpApplicationFactory类 提出请求,要求返回一个HttpApplication对象,HttpApplicationFactory在收到请求之后会检查是否有已经存在并且空闲的对象,如果有就取出一个HttpApplication对象返回给HttpRuntime类,如果没有,则要创建一个给HttpRuntime。

HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context) 该方法创建HttpApplication实例并进行初始化,调用System.Web.HttpApplication.InitInternal()方法。创建HttpApplication实例是根据实际的_theApplicationType进行创建。如果Web目录中没有global.asa文件,也就是说没有动态编译生成ASP.global_asax类型,那就直接实例化  HttpApplication。如果创建了ASP.global_asax类型,那就对ASP.global_asa进行实例化。

当每次请求到来时要穿过httpModule到达httphandler,以便被响应。而httpmodule就被配置在httpApplication中。

 

创建HttpApplication实例之后就是调用实例的InitInternal方法。

InitInternal方法的主要功能如下:

  1、HttpAplication对象被初始化时,首先调用InitModule方法来加载WebConfig文件中配置的所有HttpModule模块。

例如:

自定一个HttpModule

  2、接着HookEventHandlesForApplicationAndModules方法被调用,这个方法完成Global.asax文件中配置的HttpModule或HttpApplication的绑定

例如:

自定义HttpModule

  3、最后ApplicationStepManage对象的BuildSteps方法被调用,完成HttpApplication事件的绑定。

  4、按照顺序执行HttpApplication的各个事件。即:之前注册的对请求加以处理或者检查的HttpModule模块内容也得以执行。

    在这些事件中,第10个事件【根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理

    这个事件也是HttpHandler创建的地方。

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

前面我们一直在说ASP.NET管线,那么,谁在控制管线过程?
答案是:HttpApplication对象。
1. HttpApplication细分它的处理过程,在不同阶段引发不同的事件,使得HttpModule通过订阅事件的方式加入到请求的处理过程中。
2. 在请求的处理过程中,HttpApplication对象主要扮演着控制处理流程的推进作用。
3. HttpApplication会在固定的阶段获取一个IHttpHandler实例,然后将请求的响应过程交给具体的IHttpHandler来实现。

HttpApplication如何产生,如何工作? 
1. HttpApplication对象会被重用,当HttpRuntime不能从HttpApplicationFactory获取空闲的实例时,才会创建。
2. HttpRuntime会将每个请求交给一个HttpApplication对象来处理。
3. HttpApplication对象在初始化时负责加载全部的HttpModule。
4. 每个HttpApplication对象会控制属于它的管线过程。

HttpApplication是个非常重要的类型,它的许多功能都属于框架的基础部分,不需要我们调用, 因此,我们平时不会用到它。

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

HttpHandler根据用户请求的文件的扩展名(.aspx、.ascx、.ashx 、 .asmx)处理请求。

HttpApplication在将某个请求交给HttpHandler实例来处理时,是通过接口来调用某个合适HttpHandler类中ProcessRequest方法,来处理请求。

例如:自己定义个处理请求的HttpHandler。 (其实HttpHandler是只实现了IHttpHandler接口的类总称)

自定义一个处理请求的Handler

 所以,我们应该这样理解HttpHanlder:一个HttpHanlder用于响应一类特定的请求。

 

在请求的处理过程中,HttpApplication对象主要扮演着控制管线处理流程的作用,它负责推进整个处理流程, 除了在不同阶段引发不同的事件外(供HttpModule使用),HttpApplication对象还会根据当前请求寻找一个合适的IHttpApplicationFactory实例, 并最终得到一个IHttpHandler的实例用于处理请求。

      

            应用程序环境图形         

当每次请求到来时要穿过httpModule到达httphandler,以便被响应。

而httpmodule就被配置在httpApplication中。

               

 即流程为:

每当请求Web服务器上的某些信息时,该请求首先会到达Http.SYS,然后Http.SYS将其发送到相应的应用程序池,应用程序池传给工作进 程并加载ISAPI扩展,然后HttpRuntime对象会被创建,并通过HttpModule和HttpHandler处理请求。

    

 对于详细的HttpHandler和HttpModule可以在 Fish Li 的博客中:

用Asp.net写自己的服务框架
选择HttpHandler还是HttpModule?

 

    学习参考:http://www.cnblogs.com/hanyinglong/archive/2012/10/29/2745345.html

         http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.80).aspx    msdn解释

         http://kb.cnblogs.com/page/144577/

         http://kb.cnblogs.com/page/140611/

         http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html



本文转自武沛齐博客园博客,原文链接:http://www.cnblogs.com/wupeiqi/archive/2013/03/03/2941295.html,如需转载请自行联系原作者

目录
相关文章
|
20天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
72 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
1天前
|
JSON JavaScript 前端开发
什么是HTTP POST请求?初学者指南与示范
HTTP POST请求是一种常用的HTTP方法,主要用于向服务器发送数据。通过合理设置请求头和请求主体,可以实现数据的可靠传输。无论是在客户端使用JavaScript,还是在服务器端使用Node.js,理解和掌握POST请求的工作原理和应用场景,对于Web开发至关重要。
42 18
|
1天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
36 2
|
18天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
57 15
|
1月前
|
开发者
HTTP 协议请求方法的发展历程
【10月更文挑战第21天】
|
22天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
31 3
|
27天前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
24 5
|
1月前
|
缓存 前端开发 API
|
2月前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
124 1
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
1月前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
50 3