您的位置:首页 > 理论基础 > 计算机网络

http协议和asp.net页面生成周期

2013-04-14 21:26 134 查看
Http协议学习

lHttp协议的几个概念:
•1.连接(Connection):浏览器和服务器之间传输数据的通道。 一般请求完毕就关闭,http不保持连接。不保持连接会降低处理速度(因为建立连接速度很慢),保持连接的话就会降低服务器的处理的客户端请求数,而不保持连接服务器可以处理更多的请求。
•2.请求(Request):浏览器向服务器发送的“我要***”的消息,包含请求的类型、请求的数据、浏览器的信息(语言、浏览器版本等)。
•3.响应(Response):服务器对浏览器请求的返回的数据,包含是否成功、状态码等。

http是无状态的,不会记得“上个请求***”,所以哪怕是同一个页面中的js、css、jpg也都要重复的提交Accept-Language、Accept-Encoding、Cookie等。

网页中如果有图片、css、js等外部文件的话图片、css、js都在单独的请求中,也就是并不是页面的所有内容都在一个请求中完成,而是每个资源一个请求。

一般情况下,只有浏览器请求服务器端,服务器端才有给浏览器响应数据,不会主动向浏览器推送数据,这样是安全考虑,也是提高服务器的性能考虑。如果要服务器向浏览器推送数据,则需要使用ServerPush等额外的技术。

Http是“请求—响应”的工作方式,因此页面会不断刷新,如果不希望页面刷新则要使用AJAX等技术。

断点续传的原理。多线程下载基于断点续传。

asp.net请求过程

在Internet时代的开端,客户端的需求非常有限;.htm文件就可以满足他们的需求。但是,随着时间的流逝,客户端需求的扩充超越了.htm文件或静态文件所包含的功能。

  开发者需要扩充或扩展Web服务器的功能。Web服务器厂商设置了不同的解决方案,但是都遵循同一个主题“向Web服务器插入某些组件”。所有的Web服务器补充技术都允许开发者建立并插入组件以增强Web服务器的功能。微软公司提出了ISAPI(Internet服务器API),网景公司提出了NSAPI(网景服务器API)等等。

  ISAPI是一种重要的技术,它允许我们增强与ISAPI兼容的Web服务器(IIS就是一种与ISAPI兼容的Web服务器)的能力。我们使用下面的组件达到这个目的:

  · ISAPI扩展

  · ISAPI过滤器

  ISAPI扩展是使用Win32动态链接库来实现的。你可以把ISAPI扩展看作是一个普通的应用程序。ISAPI扩展的处理目标是http请求。这意味着你必须调用它们才能激活它们。 你可以认为ISAPI过滤器仅仅就是一个过滤器而已。客户端每次向服务器发出请求的时候,请求要经过过滤器。客户端不需要在请求中指定过滤器,只需要简单地把请求发送给Web服务器,接着Web服务器把请求传递给相关的过滤器。接下来过滤器可能修改请求,执行某些登录操作等等。

  由于这些组件的复杂性,实现它们非常困难。开发者不得不使用C/C++来开发这些组件,但是对于很多人来说,使用C/C++进行开发简直就是痛苦的代名词。

  那么ASP.NET提供什么东西来实现这些功能呢?ASP.NET提供的是HttpHandler(HTTP处理程序)和HttpModule(HTTP模块)。

请求流程:

浏览器端请求过来----> IIS服务器接收

建立socket连接------> 浏览器端传输数据

IIS如果处理不了------> aspnet_isapi.dll(isapi:Internet Server Application Programing Interface)---->进入framework处理

----->Aspnet_wp.exe------>ProcessRequest----->HttpRuntime----->创建httpcontext(程序上下文)和write(响应流,返回输出结果)

交由HttpApplicationFactory----->HttpApplication,读取machine.config,web.config中HttpModule(初始化管理,也就是过滤器)

----->HttpApplication调用IHttpHandlerFactory------>HttpHandler---->HttpRuntiome

HttpRuntime调用IHttpHandler.ProcessRequest()处理请求





HttpModule模块 (推荐:http://www.cnblogs.com/dev-xp/archive/2009/09/20/1570346.html)

ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把http请求传递给管道中的所有模块。每个模块都接收http请求并有完全控制权限。模块可以用任何自认为适合的方式来处理请求。一旦请求经过了所有HTTP模块,就最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过管道中的HTTP模块。

HTTP模块是实现了System.Web.IhttpModule接口的.NET组件。这些组件通过在某些事件中注册自身,把自己插入ASP.NET请求处理管道。当这些事件发生的时候,ASP.NET调用对请求有兴趣的HTTP模块,这样该模块就能处理请求了。

HTTP模块实现了IhttpModule接口的下面一些方法:

方法名称描述
Init这个方法允许HTTP模块向HttpApplication 对象中的事件注册自己的事件处理程序。
Dispose这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。
HttpApplication 类的实例(是不是想起Global文件了?)是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的。HttpApplication 类的一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。这样,成员变量才可用于存储针对每个请求的数据。

应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件:

1.BeginRequest(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生)

2.AuthenticateRequest (当安全模块已建立用户标识时发生。注:AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。)

3.PostAuthenticateRequest (注意:该事件在 .NET Framework 2.0 版中是新增的。 当安全模块已建立用户标识时发生。PostAuthenticateRequest 事件在 AuthenticateRequest 事件发生之后引发。预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据。)

4.AuthorizeRequest (当安全模块已验证用户授权时发生。AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。)

5.PostAuthorizeRequest (.NET 2.0里新增的事件。在当前请求的用户已获授权时发生。PostAuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权。)

6.ResolveRequestCache (当 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过事件处理程序(例如某个页或 XML Web services)的执行。)

7.PostResolveRequestCache (在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。)在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序(对应于请求 URL 的页)。

8.PostMapRequestHandler(在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。)

9.AcquireRequestState ***********注意:能使用到Session*******************

10.PostAcquireRequestState

11.PreRequestHandlerExecute(执行事件处理程序。)

12.PostRequestHandlerExecute ***********注意:能使用到Session*******************

13.ReleaseRequestState

14.PostReleaseRequestState (在PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。)

15.UpdateRequestCache

16.PostUpdateRequestCache

17.EndRequest

除了这些事件之外,我们还可以使用四个事件。我们可以通过实现Web应用程序的global.asax文件中一些方法来使用这些事件。

HttpHandler处理程序

HTTP处理程序是实现了System.Web.IHttpHandler接口的.NET组件。任何实现了IHttpHandler接口的类都可以用于处理输入的HTTP请求。HTTP处理程序与ISAPI扩展有些类似。HTTP处理程序和ISAPI扩展的差别在于在URL中可以使用HTTP处理程序的文件名称直接调用它们,与ISAPI扩展类似。

  HTTP处理程序实现了下列方法:

方法名称描述
ProcessRequest这个方法实际上是http处理程序的核心。我们调用这个方法来处理http请求。
IsReusable我们调用这个属性来决定http处理程序的实例是否可以用于处理相同其它类型的请求。HTTP处理程序可以返回true或false来表明它们是否可以重复使用。
  你可以使用web.config或者machine.config文件把这些类映射到http请求上。映射完成以后,当接收到相应请求的时候ASP.NET会实例化http处理程序。我们将解释如何在web.config和/或machine.config文件中定义所有这些细节信息。

  ASP.NET还通过IHttpHandlerFactory接口支持http处理程序的扩展。ASP.NET提供了把http请求路由到实现IHttpHandlerFactory接口的类的对象上的能力。此外,ASP.NET还利用了Factory设计模式。这种模式为建立一组相关对象而不提供具体类的功能提供了接口。简单的说,你可以把用于建立依赖传递进来的参数建立的http处理程序对象的类看作是factory(工厂)。我们不用指定需要实例化的特定的http处理程序;http处理程序工厂处理这种事务。这样做的优点在于如果未来实现IHttpHandler接口的对象的实现方法发生了改变,只要接口仍然相同,客户端就不会受到影响。

  下面是IHttpHandlerFactory接口中的方法列表:

方法名称描述
GetHandler这个方法负责建立适当的处理程序并把它的指针返回到调用代码(ASP.NET运行时)。这个方法返回的处理程序对象应该实现了IHttpHandler接口。
ReleaseHandler这个方法负责在请求处理完成后释放http处理程序。Factory 实现决定了它的操作。Factory 实现可以是实际摧毁实例,也可以把它放入缓冲池供以后使用。
  在配置文件中注册HTTP处理程序和HTTP处理程序工厂

此文参照了:

asp.net请求过程:http://www.yesky.com/86/1836086_5.shtml

页面生存周期:http://hi.baidu.com/%C3%E7%B7%A2%CE%AA/blog/item/17eb7810adc31e1b4a90a71f.html

Asp.net使用管道模型:http://www.cnblogs.com/dev-xp/archive/2009/09/20/1570346.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: