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中,借助于事件的强大威力,我们可以通过处理管道将复杂的处理步骤封装起来,通过事件将处理过程的多个步骤暴露给程序员,以便于程序员对管理管道进行扩展。

.NET本质论之三(应用程序对象 )的更多相关文章

  1. ASP.NET本质论第二章应用程序对象学习笔记1

    1.请求的处理参数—上下文对象HttpContext 1) 针对每一次请求,ASP.NET将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.NET服务器的处理过 ...

  2. Application 应用程序对象使用介绍

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoApplicatio ...

  3. .NET本质论(4)应用程序对象HttpApplication

    当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication.  在ASP.NET内部,HttpRuntime管理一个定 ...

  4. Ninject之旅之三:Ninject对象生命周期

    摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...

  5. 【object-c基础】Object-c基础之三:面对对象开发@interface,@implementation

    1.@interface 在java等语言编程中,创建类都是用class,但在object-c中,用@interface. 例子: @interface circle :NSObject    //定 ...

  6. python小练习之三---购物车程序

    购物车购物的例子 严格来讲,这个例子相对大一些 功能也稍完备一些,具有用户登录,商品上架,用户购物,放入购物车,展示每个用户的购物车里的商品的数量,用户账户余额,支持用户账户充值等 下面展示的代码有些 ...

  7. 【美妙的Python之三】Python 对象解析

    美妙的Python之Python对象         简而言之: Python 是能你无限惊喜的语言.与众不同.         Python对象概念的理解,是理解Python数据存储的前提.Pyth ...

  8. 微信小程序 - 对象转换成对象数组

    后端传过来的一个个对象 {1,2,3,4},{1,3,5,},{1,3,5} 我们应该转化为数组对象 [{},{},{},{}]  ,最后通过wx:for遍历到页面 示例图:

  9. Java Socket实战之三:传输对象

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...

随机推荐

  1. Java事务处理全解析(三)——丑陋的案例

    在本系列的上一篇文章中,我们看到了一个典型的事务处理失败的案例,其主要原因在于,service层和各个DAO所使用的Connection是不一样的,而JDBC中事务处理的作用对象正是Connectio ...

  2. iphone Dev 开发实例9:Create Grid Layout Using UICollectionView in iOS 6

    In this tutorial, we will build a simple app to display a collection of recipe photos in grid layout ...

  3. (PowerShell) Managing Windows Registry

    http://powershell.com/cs/blogs/ebookv2/archive/2012/03/23/chapter-16-managing-windows-registry.aspx

  4. TCP程序设计

        在Java中使用Socket(套接字)完成TCP程序的开发,使用此类可以方便地建立可靠的.双向的.持续的.点对点的通信连接.     在Socket的程序开发中,服务器端使用ServerSoc ...

  5. HTTP协议下保证登录密码不被获取更健壮方式

    说到在http协议下用户登录如何保证密码安全这个问题:    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...

  6. ADF_Tutorials系列17_ADF Faces_ADF预定义组件的创建和使用

    2013-05-01 Created By BaoXinjian

  7. codeblocks AStyle修改格式和快捷键

    首先我想说 codeblocks还是很强大的,原来以为不能改,其实是不会,那么本篇博客就教大家修改AStyle格式和添加快捷键. 1.修改AStyle格式: Settings -> Editor ...

  8. 图片_ _Android有效解决加载大图片时内存溢出的问题 2

    Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或 setImageResource或 Bit ...

  9. 使用thinkphp连接sqlserver数据库时提示“系统不支持:sqlsrv”

    习惯了使用php跟mysql组合,现在接到项目需要调用客户线下的系统软件的数据,具了解,这个软件的数据库是用sqlserver数据库也就是常说的mssql数据库了. 那么我现在需要用PHP连接sqls ...

  10. Think in UML笔记第1章--为什么要UML

    1.1 面向过程还是面向对象 面向过程和面向对象都是一种软件技术.例如把面向过程归纳为结构化程序设计.DFD图.ER模型.UC矩阵等,而面向对象则被归纳为继承.封装.多态.复用等具体的技术.事实上,上 ...