.NET本质论之三(应用程序对象 )

 2.1 请求的处理参数------上下文对象HttpContext   现在,请求已经到达了ASP.NET服务器,为了处理请求,ASP.NET在服务器上创建了HttpRequest类型的对象以表示请求参数,HttpResponse类型的对象以表示回应的处理对象。别处,还有HttpServerUtility类型的对象处理网站虚拟路径与服务器文件系统路径之间的映射关系。也就是说,为了处理一次Http请求,我们需要众多的对象来表示处理请求所需要的数据,处理请求的方法就需要接收诸多的参数来完成处理工作,为了进一步简化服务器端对参数的处理工作,ASP.NET中定义了HttpContext类型来统一处理参数的表示问题。

  2.1.1常用成员    针对每一次请求,ASP.NET将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.NET服务器的处理过程 中传递所有需要的参数,在请求到达ASP.NET服务器之后,这个对象将被创建出来,在一次请求处理之后,这个对象将被丢弃掉。由于在大多数的处理环节都需要用到这个对象,因此,HttpContext类中还提供了一个名为Current的静态属性,以便于在处理过程中,不需要通过方法的参数面直接取得当前的上下文对象。当然,在没有请求的情况下,通过这个属性获得的结果将是null.    HttpContext中的常用属性如下:

 类型    属性名称     说明

 HttpRequest   Request      请求参数对象  HttpResponse   Response     回应处理对象  HttpServerUtiliity  Server      服务器实用工具  IDictionary   Items    在服务器处理请求的过程中,通过httpContext传递的参数字典  IPrincipal   User       当前请求的用户对象  IHttpHandler   Handler     处理当前请求的处理程序对象   Cache    Cache     Web服务器的缓存管理对象     HttpApplicationState  Application    Web服务器的全局状态管理对象  HttpSessionState  Session     当前请求的会话状态对象  ProfileBase   Profile     当前请求的个性化数据对象  DateTime   Timestamp    当前请求开始处理的时间点

Timestamp 表示请求在服务器上的开始处理时间,当我们需要计算当前请求的处理时间的时候,结合DateTime.Now,可以非常方便地计算出来

  2.1.2底层方法    虽然使用HttpContext所提供方法的机会并不多,但是,HttpContext提供了一些底层的方法,在编写HttpModule的时候非常有用。        表2.2 底层方法      返回类型   方法名称   说明  void    RewritePath   将服务器收到的请求URL替换为另外一个指定的URL  Object    GetSection   获取配置文件中的配置节    void    RemapHandler   重新设置当前的处理程序  

 RewritePath方法用于将HttpRequest中的原始请求地址替换为指定的地址,以便在后台 的处理中,使asp.net认为请求的实际地址是这个新的地址,这个方法在使用无Cookie的会话中非常有用,使用它将嵌入在URL中的SessionID取出来,将URL地址修正为一个普通的URL,这样,后继的处理就不会受到影响,别处,在 URL重写中,这个方法也很有用,可以将一个看似静态地址的URL映射到一个普通的ASP.NET处理上。  2.2应用程序对象HttpApplication   当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication.   在ASP.NET内部,HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的实例,HttpApplicationFactory通过工厂模式管理HttpApplication对象,在HttpApplicationFactory内部维护了一个HttpApplication对象池,使得被创建的HttpApplication对象可以被重复使用。但是,每一个HttpApplication对象每一次仅仅用于处理一个请求,这样,对于ASP.NET程序员来说,也就不需要考虑HttpApplication中多个请求并发的处理问题了。   在实际的请求处理过程中,我们还需要进行大量的工作,例如,检查当前的请求是由哪一个用户发起的,以此我们就可以针对不同的用户进行不同的处理;或者根据用户来决定是否对用户的请求进行处理,对于没有权限的用户返回一个缺少相应权限的回应等。如果我们在一个方法中来完成这些任务,显然会造成方法的过度 臃肿。在HttpApplication中利用.NET中的事件机制,通过在处理过程中依次发出的多个事件,将这个处理过程分解为多个步骤,这个处理机制通常我们称为处理管道。   2.2.1 处理管道    所谓的处理管道,就是处理复杂问题的时候,将处理的过程分解为多个处理步骤,我们将这种经过多个步骤的处理方式称为处理管道。在.NET中,借助于事件的强大威力,我们可以通过处理管道将复杂的处理步骤封装起来,通过事件将处理过程的多个步骤暴露给程序员,以便于程序员对管理管道进行扩展。

原文地址:https://www.cnblogs.com/haofaner/p/5073652.html