主要总结:HttpRuntime、HttpContext、(HttpServerUtility , HttpUtility)、HttpRequest、HttpResponse五个对象。
Asp.net,可以理解为一个底层框架平台,它负责接收HTTP请求(从IIS传入),将请求分配给一个线程, 再把请求放到它的处理管道中,由一些其它的【管道事件订阅者】来处理它们,最后将处理结果返回给客户端。 WebForms或者MVC框架,都属于Asp.net平台上的【管道事件订阅者】而已,Web Service也是哦。
当浏览器发起请求时,会先构建请求报文。
HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
Http请求:可简单理解为,由请求头和请求体组成。
Asp.net中,我们可以直接访问http请求发送来的数据,这是为什么呢?
//--------------------------------------------------------------------------------------
一下内容主要介绍的是http请求,从客户端,到服务器硬件,再到iis服务器软件,在到HttpRuntime之间的过程,这个过程很复杂,你可以忽略过去!
来自浏览器(也可以是其他各种客户端工具,模拟器,自己写的代码等)的请求,由HTTP.SYS后转发到IIS。
HTTP.SYS是一个内核模式网络驱动程序,即HTTP.SYS运行在内核模式下,作为驱动程序而存在。
从结构上来讲,HTTP.SYS是位于TCPIP.SYS之上的。也就是说,一个请求首先由TCPIP.SYS处理,然后才转发到HTTP.SYS上;
同理,该请求被Web应用程序处理后作为响应返回时则是先到达HTTP.SYS在转发到TCPIP.SYS最后到达客户端浏览器。
注意:TCPIP.SYS和HTTP.SYS都处于内核模式下。
注:为了避免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。
HTTP.SYS的主要功能是监听用户(来自于TCPIP.SYS)的HTTP请求。
管理TCP连接
………………
………………
路由HTTP请求到正确的WEB应用程序池。
HTTP.SYS中维护着一个从URL到WEB应用程序池的对应关系路由表(映射表),所以HTTP.SYS可以迅速将WEB请求转发到web应用程序。注意,如果WEB请求没找到相应的映射,则返回404错误,就是我们常见的那个并不雅观的页面。当然你也可以自己画一个漂亮的将这个页面覆盖掉。
HTTP.SYS还有其他很多功能,是什么呢?
其最最重要的功能就是监听来自用户的WEB请求,请一定要记住。
上面介绍了HTTP.SYS是什么以及其功能特点,那么HTTP.SYS是如何工作的呢?
当你创建一个WEB站点的时候,IIS就会在HTTP.SYS上注册这个站点,这样就会接收来自该站点的任何WEB请求。HTTP.SYS从功能上讲类似于一个转发器。发送收到的WEB请求到WEB应用程序,并且发送返回的响应到客户端。
这不得不引出另外两个IIS6.0的核心组件:工作进程(WORKER PROGESS)和WEB管理器(WEB ADMIN SERVICE)。
当一个有效的WEB请求到达HTTP.SYS后,发现没有相应有效的工作进程,则HTTP.SYS会告诉WAS(svchost.exe),以为之创建并启动一个工作进程(w3wp.exe)。在启动工作进程的过程中加载ISAPI(非托管代码)以及CLR(托管代码),然后在工作进程中创建应用程序域。其实如上一系列操作只是为WEB请求准备好其运行环境。
当一个WEB请求进入已经准备好的工作进程边界(工作进程从HTTP.SYS的应用程序池对应的消息队列中取出该WEB请求),那此时首先会经过ISAPI FILTER的处理,比如修改http报头和URL等,具体功能参见上文。接下来就会将处理的WEB请求交给ISAPI EXTENSION。那么ISAPI EXTENSION会干什么呢?
我先来说说WWW Service,也就是WAS。WAS是一个管理和监视工作进程的组件,它宿主在SveHost.exe中,运行在用户模式下。WAS负责同MetaBase进行交互以获取其配置数据信息,这些配置信息会通过WAS注册到HTTP.SYS中。同时WAS还负责监视管理工作进程。一旦工作进程出现故障,WAS会为其创建新的工作进程以响应Web请求。
ISAPIRuntime,它的主要功能就是负责ISAPI扩展的非托管代码与托管代码之间的沟通与交互。可以借助reflector.exe等工具进行跟踪研判。
原文作者只说了IIS6.0的三个核心组件HTTP.SYS、WAS以及Worker Progress,另外两个(Inetinfo.exe和IIS MetaBase)只是轻描淡写。
以上参考文章:http://www.cnblogs.com/tiwlin/archive/2010/09/02/1815584.html
参考关键词:WEB请求的全过程
//----------------------------------------------------------------------------------------
HttpContext
该对象是最重要的核心对象。
属性:
AllErrors、Application、ApplicationInstance、CurrentHandler、CurrentNotification、Error、Handler(不常用)
Cache、静态属性HttpContext.Current、Request、Response、Session、Server、User(常用)
补充属性User, Items
User属性保存于当前请求的用户身份信息。如果判断当前请求的用户是不是已经有过身份认证,可以访问:Request.IsAuthenticated这个实例属性。
Items是个字典,因此适合以Key/Value的方式来访问。如果希望在一次请求的过程中保存一些临时数据,那么,这个属性是最理想的存放容器了。 它会在下次请求重新创建,因此,不同的请求之间,数据不会被共享。
如果希望提供一些静态属性,并且,只希望与一次请求关联,那么建议借助HttpContext.Items的实例属性来实现。
还有很多方法,请自己查看。
HttpRequest
使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。
HttpRequest包含所有输入数据QueryString, Form, Cookie,请求头,(ip,hostName,MacAddress) ,浏览器的相关信息、请求映射的相关文件路径、URL详细信息、请求的方法、请求是否已经过身份验证,是否为SSL等等。
大量的属性如:IsAuthenticated、HttpMethod 、QueryString、Form 、Files、Cookies、InputStream(输入流)、Headers 、Path、Browser 、RawUrl 、MapPath、FilePath、Url 、Params、ApplicationPath、AppRelativeCurrentExecutionFilePath 、Filter 等等。
----------------------------------------------------
ASP.NET管线
主要参与者
1. HttpModule
2. HttpHandlerFactory
3. HttpHandler
前面我们一直在说ASP.NET管线,那么,谁在控制管线过程?
答案是:HttpApplication对象。
在ASP.NET管线中,HttpHandler应该只有一个,而HttpModule是可选的。
注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。
1. HttpApplication细分它的处理过程,在不同阶段引发不同的事件,使得HttpModule通过订阅事件的方式加入到请求的处理过程中。
2. 在请求的处理过程中,HttpApplication对象主要扮演着控制处理流程的推进作用。
3. HttpApplication会在固定的阶段获取一个IHttpHandler实例,然后将请求的响应过程交给具体的IHttpHandler来实现。
HttpHandler(Http处理程序)、HttpModule(Http模块)
HttpModule检查请求,
HttpHandler处理事件
当请求到达HttpModule的时候,系统还没有对这个请求真正处理,我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,或者截获这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中把请求处理的结果进行再次加工返回客户端。
----------------------------------------------------------------
HttpResponse
向客户端返回结果。所有需要向客户端返回的操作,都要调用HttpResponse的方法。
如:响应头、响应流。
拥有属性:StatusCode 、ContentType、Cookies 、OutputStream(输出流)、Cache 、Filter 等
方法:
AppendHeader()
Write()
End()
Redirect()
TransmitFile()
在服务端发生异常不能返回正确结果时,设置StatusCode属性,比如:Response.StatusCode = 500,可以激活客户端的ajax回调方法:error:function(){alert("服务器出错!")}
HttpRequest和HttpResponse的Filter,这个属性实现的效果就是装饰器模式,你可以对输入输出流进行装饰。
HttpRuntime,
下有:HttpRuntime.Cache缓存。Page.Cache或者HttpContext.Cache都是对它的引用。
HttpServerUtility
下有:HtmlEncode()方法,用于防止注入攻击,它负责安全地生成一段HTML代码。
HtmlAttributeEncode(),它也是用于防止注入攻击,安全地输出一个HTML属性。
JavaScriptStringEncode(),也是为了防止注入攻击,安全地在服务端输出一段JS代码。
UrlEncode()方法,对url进行编码。
HtmlDecode(), UrlDecode()用于解码。
Execute()此方法用于,获取一个页面或者用户控件的HTML输出时很有用。
HttpApplication
当HttpContext对象创建以后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型就是HttpApplication。
HttpApplication有19个标准事件
BeginRequest,这个事件标志着服务器处理工作的开始。
开始处理请求后,第一个工作就是要验证用户的身份以实现安全机制
通过AuthenticateRequest和PostAuthenticateRequest两个事件处理
AuthenticateRequest 验证请求,一般用来处理取得请求的用户信息
PostAuthenticateRequest 已经获取请求的用户信息
第四个事件AuthorizeRequest触发的时候,表示进行用户权限的检查工作
第五个事件则标志着完成了用户权限的检查工作
如果用户没有通过安全检查,一般情况下,将跳过剩下的事件,直接触发最后一个事件结束处理。
ResolveRequestCache事件标志着检查缓存
PostResolveRequestCache 表示缓存检查的结束。
(这个地方比较特殊,如果有缓存的话,是不是就立即给用户返回结果了呢?)
在ASP,NET中提供了许多处理程序,程序员也可以自定义处理程序,为了处理这个请求,ASP.NET必须按照匹配规则找到一个处理当前求情的处理程。
PostMapRequestHandler事件标志ASP.NET已经获得了这个处理程序对象,HttpContext的Handler就表示这个处理对象。
为了获取用户以前保存的数据,AcrequireRequestState事件给程序员提供了一个切入点,PostAcrequireRequestState 则表示已经获取了用户的数据,可以在处理中使用了。
接下来就是PreRequestHandlerExcute真正开始告诉程序员处理程序就要开始工作了。如果用户的状态已经获取,还有需要在处理程序处理之前进行的工作,就在这个事件中开始吧。
PreRequestHandlerExcute事件之后,ASP.NET服务器将通过执行处理程序完成请求的处理工作,这个处理程序可能是一个Web窗体,也可能是一个Web服务。
处理程序完成后,服务器开始扫尾工作,PostRequestHandlerExcute 通知程序员,ASP.NET服务器的处理程序已经完成。
第12个事件是个重要的节点啊!
ReleaseRequestState事件通知程序员释放在处理程序中操作的特殊数据,PostReleaseRequestState则表示已经释放完成。
如果希望将这次处理的结果缓存起来,以便于在后继的请求中可以直接使用这个结果,UpdateRequestCache 提供了处理的机会。
PostUpdateRequestCache 则表示缓存已经更新完成。
以上16个事件结束了,还剩下三个事件。
17 LogRequest 请求的日志操作
18 PostLogRequest 已经完成了请求的日志操作
19 EndRequest 本次请求到此结束
应用程序域创建完成之后,一个ISAPIRuntime对象被创建,并自动调用它的ProcessRequest()方法。
创建一个HttpWorkerRequest对象,调用ISAPIRuntime对象的StartProcessing()方法,开始HTTP Pipeline,一个HttpRuntime类型的对象被创建,HttpRuntime对象调用ProcessRequest()方法,创建了一个HttpContext对象。HttpContext 对象包含了在编程中非常常见的HttpResponse(返回给浏览器处理过的信息)和HttpRequest(获得Http请求信息) 两个对象。
HttpModule对象:在初始化HttpApplication对象时被初始化,一个HttpApplication 可以有多个HttpModule对象,HttpModule对象的主要职责就是在不同时期把相应的事件注册到HttpApplicatioin事件当中去。比如完成身份验证,授权,操作缓存等。Asp.Net MVC UrlRouteModule路由模块就是重写了HttpModele
HttpHandler对象:在初始化HttpApplication对象时被初始化,一个HttpApplication可以有多个HttpHandler对象,HttpHander负责最终处理Http请求。不同的文件有不同的HttpHander负责处理。Asp.Net MVC MvcHandle完成了最终处理。
设置输出缓存的最根本手段还是调用Response.Cache的一些公开方法,修改输出响应头。