13.4 上下文对象

有关应用程序状态的详情、处理的请求以及构建的响应信息全部通过上下文对象来获取。下面将介绍用于提供上下文的类:HttpContext、 HttpApplication,HttpRequest,HttpResponse类,所有这些类均位于System.Web。

13.4.1 HttpContext

Encapsulates all HTTP-specific information about an individual HTTP request. HttpContext。用于从头到尾跟踪请求的状态,它也是有关请求的所有可用信息(包括HttpRequest和HttpResponse对象)的通道。还会定义可用于管理请求生命周期的方法和属性。

名称 说明
Application

为当前 HTTP 请求获取 HttpApplicationState 对象。

ApplicationInstance

为当前 HTTP 请求获取或设置 HttpApplication 对象。

Cache

获取当前应用程序域的 Cache 对象。

Current

为当前 HTTP 请求获取或设置 HttpContext 对象。

CurrentHandler

获取表示当前正在执行的处理程序的 IHttpHandler 对象。

CurrentNotification

获取一个 RequestNotification 值,该值指示当前正在处理的 HttpApplication 事件。

Error

获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。

Handler

获取或设置负责处理 HTTP 请求的 IHttpHandler 对象。

IsDebuggingEnabled

获取一个值,该值指示当前 HTTP 请求是否处于调试模式。如果已将调试器附加到web窗体应用程序,则返回true。

IsPostNotification

在 HttpApplication 事件完成处理之后获取 ASP.NET 管道的当前进程点的值。

Items

获取可用于在 HTTP 请求过程中在 IHttpModule 接口和 IHttpHandler 接口之间组织和共享数据的键/值集合。返回可用于

在参与处理请求的ASP.NET Framework组件之间传递状态数据的集合。

Profile

获取当前用户配置文件的 ProfileBase 对象。

Request

为当前 HTTP 请求获取 HttpRequest 对象。

Response

获取当前 HTTP 响应的 HttpResponse 对象。

Server

获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。其中包含实用功能,最有用的功能包括:用于对字符串

进行安全编码以将其作为HTML显示的方法,以及用于控制请求处理程序执行的功能。

Session

为当前 HTTP 请求获取 HttpSessionState 对象。

Timestamp

获取当前 HTTP 请求的初始时间戳。

Trace

获取当前 HTTP 响应的 TraceContext 对象。

User

获取或设置当前 HTTP 请求的安全信息。

13.4.2 HttpApplication

在ASP.NET Framework 中用到的许多基类都提供了一些便捷属性,这些属性与那些由HttpContext类定义的属性对应。Defines the methods, properties, and events that are common to all application objects in an ASP.NET application.

属性

  名称 说明
Application

获取应用程序的当前状态。

Context

获取关于当前请求的 HTTP 特定信息。

Events

获取处理所有应用程序事件的事件处理程序委托列表。

Modules

获取当前应用程序的模块集合。

  RegisterModule(type)

添加一个新模块。

Request

获取当前请求所对应的内部请求对象。

Response

获取当前请求所对应的内部响应对象。

Server

获取当前请求所对应的内部服务器对象。

Session

获取提供对会话数据的访问的内部会话对象。

User

获取当前请求的内部用户对象。

方法

CompleteRequest()

使 ASP.NET 跳过 HTTP 执行管线链中的所有事件和筛选并直接执行EndRequest 事件。

Dispose()

处置 HttpApplication 实例。

Equals(Object^)

确定指定的对象是否等于当前对象。(从 Object 继承。)

GetType()

获取当前实例的 Type。(从 Object 继承。)

Init()

在添加所有事件处理程序模块之后执行自定义初始化代码。

ToString()

返回表示当前对象的字符串。(从 Object 继承。)

这其中的多数成员都是HttpContext类对应的便捷属性。接下来介绍一些要注意的要点。

1.处理属性异常

Request,Response、Session、User属性全部返回HttpContext类中对应属性的值,缺点是:如果他们从HttpContext中获得的值为null,所有这些属性将抛出HttpException。

        //使用HttpContext属性来确定当前应用程序事件。
        public Global()
        {
            BeginRequest += HandleEvent;
            EndRequest += HandleEvent;
            AcquireRequestState += HandleEvent;
            PostAcquireRequestState += HandleEvent;
        }

        protected void HandleEvent(object sender, EventArgs e)
        {
            string eventName = "<Unknown>";
            switch (Context.CurrentNotification)
            {
                case RequestNotification.BeginRequest:
                case RequestNotification.EndRequest:
                    eventName = Context.CurrentNotification.ToString();
                    break;
                case RequestNotification.AcquireRequestState:
                    if (Context.IsPostNotification)
                    {
                        eventName = "PostAcquireRequestState";

                    }
                    else
                    {
                        eventName = "AcquireRequestState";
                    }
                    break;

            }
            EventCollection.Add(EventSource.Application, eventName);

        }
        protected void Application_Start(object sender, EventArgs e)
        {
            EventCollection.Add(EventSource.Application, "Start");
            Application["message"] = "Application Events";
            CreateTimeStamp();
        }
protected void CreateTimeStamp()
        {
            string stamp = Context.Timestamp.ToLongTimeString();
            if ( Session != null)
            {
                Session["request_timestamp"] = stamp;
            }
            else
            {
                Application["app_timestamp"] = stamp;
            }
        }
 

将会报错

更新CreateTimeStamp方法以使用HttpContext属性

protected void CreateTimeStamp()
        {
            string stamp = Context.Timestamp.ToLongTimeString();
            if (Context.Session != null)
            {
                Session["request_timestamp"] = stamp;
            }
            else
            {
                Application["app_timestamp"] = stamp;
            }
        }

2完成请求

HttpApplication.CompleteRequest方法可用于废弃请求生命周期的正常流程。直接跳到LogRequest事件。如果要实现一个自定义错误处理程序模块,或者如果代码能够满足其自身的需求,而不需要其他模块或处理程序的帮助,那么可以使用此方法。

14.4.3 HttpRequest

HttpRequest对象用于描述所处理的HTTP请求。(使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。)下表列出了提供有关请求的信息的属性。

HttpRequest的作用是令到Asp.net能够读取客户端发送HTTP值。比如表单、URL、Cookie传递过来的参数。

  返回字符串的那些值就不说了,那些基本上都是与HTTP请求报文相关的东西。

  现在看看返回NameValueCollection对象的东东,这个对象只是为了存储返回的东西。

  1、Request.Headers;

  这个东西返回的是什么呢?写个实例:

       public ActionResult Index()
        {
            HttpRequest request = System.Web.HttpContext.Current.Request;
            NameValueCollection headersCollect = request.Headers;
            string[] headArr = headersCollect.AllKeys;
            foreach (string str in headArr)
            {
                Response.Write(str + ":" + headersCollect.Get(str) + ";<br/>");
            }
            return View();
        }

 看看在浏览器输出:

  再用火狐看看HTTP请求报文的请求头信息:

  明显可以看到,这个request.Headers返回的就是请求头信息的一个NameValueCollection集合。

  2、Request.Form

  这个属性获取的是浏览器提交的表单内容,也是返回NameValueCollection对象,这个对象中包含了所有的表单键值对内容。

  看前台HTML代码:

<form action="/Home/GetForm" method="post">
    <p>姓名:<input type="text" name="Name" /></p>  //输入张三
    <p>年龄:<input type="text" name="Age" /></p>   //输入12
    <p>性别:<input type="radio" name="male" value="man" />男 &nbsp; <input type="radio" name="male" value="woman" />女</p>  //选择 男
    <p><input type="submit" value="提交" /></p>
</form>

后台代码:

  public ActionResult GetForm()
        {
            HttpRequest request = System.Web.HttpContext.Current.Request;
            NameValueCollection FormCollect =  request.Form;
            foreach (string str in FormCollect)
            {
                Response.Write(str + ": " + FormCollect.Get(str) + "<br/>");
            }
            return Content("键值对数目:" + FormCollect.Count);
        }

浏览器输出:

Name: 张三
Age: 12
male: man
键值对数目:3

3、Request.QueryString

  该属性的作用是将URL中的参数全部保存到NameValueCollection集合中。

 public ActionResult TestCookie()
        {
            NameValueCollection nvc = new NameValueCollection();
            nvc = System.Web.HttpContext.Current.Request.QueryString;
            Response.Write(nvc.Count + "   ");  //输出路径中参数集合的总数
            if (nvc.Count > 0)
            {
                foreach (string str in nvc.AllKeys)
                {
                    Response.Write(str + ": " + nvc.Get(str) + ";  ");      //遍历url参数集合,输出参数名与值
                }
            }
            return View();
            //当路径为http://localhost:22133/Home/testCookie?id=1&name=张三&Age=23
            //输出3 id: 1; name: 张三; Age: 28;      

4、Params,Item与QueryString、Forms的区别

  • Get请求用QueryString;
  • Post请求用Forms;
  • Parms与Item可以不区分Get请求还是Post请求;

  Params与Item两个属性唯一不同的是:Item是依次访问这4个集合,找到就返回结果,而Params是在访问时,先将4个集合的数据合并到一个新集合(集合不存在时创建), 然后再查找指定的结果。

时间: 2024-11-03 20:48:55

13.4 上下文对象的相关文章

【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前的习惯,我们还是新建几个文件夹 Commons:存放帮助类 Domians:数据模型 Services:接口和实现类 我们在Domains文件夹下添加一个类库 Domain 我们新建一个类 ApplicationDbContext 继承 DbContext 1 using Microsoft.Ent

[译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)

使用 HttpRequest 对象 HttpRequest 对象描述的是一个正在被处理的 HTTP 请求.下表列举了 HttpRequest 中的属性,它们提供了当前请求的相关信息(HttpRequest 类定义了一些方法和属性,我们会逐步讲解当中的一些属性). 表 1 – HttpRequest 类中属性 名称 描述 AcceptTypes 返回一个可以被浏览器接受的 MIME 类型的字符串数组. Browser 返回一个可以用来描述浏览器功能的 HttpBrowserCapabilities

执行上下文对象的原理及使用

执行上下文对象: 在浏览器执行javascript代码之前,浏览器会做一些准备工作(从准备工作这一操作开始,直到对应的这一作用域的所有代码被执行完,这样的一个过程就叫做执行上下文;执行上下文可以被看成一个对象,这个对象 就是用来管理其对应作用域中的各个数据,这些数据就是对象中的属性). 一. 全局作用域中的一些准备工作     1. 找到标记的全局变量,并为其赋值为undefined;     2. 给this赋值为window对象     3. 函数声明,并给函数赋值为整个函数块 二. 函数作

flask快速入门笔记三_上下文对象:Flask核心机制

首先声明:内容大部分来自huizhiwang,只是单纯记笔记. 1 请求 :WSGI WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口. WSGI将Web服务分成两个部分:服务器和应用程序.WGSI服务器只负责与网络相关的两件事:接收浏览器的 HTTP请求.向浏览器发送HTTP应答:而对HTTP请求的具体处理

基于Spring DM管理的Bundle获取Spring上下文对象及指定Bean对象

在讲述服务注册与引用的随笔中,有提到context.getServiceReferences()方法,通过该方法可以获取到OSGI框架容器中的指定类型的服务引用,从而获取到对应的服务对象.同时该方法还可以通过Bundle-SymbolicName名称获取到该Bundle中的Spring上下文对象,同样根据Spring上下文对象,我们也可以很好的获取到对应服务对象(服务对象,就是Spring中的一个Bean对象) String callName = "com.sample.service.IHel

EF上下文对象创建之线程内唯一

在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,那么会造成数据混乱,每次创建的对象执行相应的数据库操作,此同时,其他的EF对象内获得的数据可能已经是“过期”的了.即这个数据已经变动过.这就是数据混乱,为了解决这个问题,关键就是对象的创建问题. 这里首先想到单例模式,不过在这里,不适合用,原因是使用单例模式,会使EF对象得不到及时的资源释放. 第二种方式即保证在线程内对象唯一,如何保证呢,通过微软ASP机制的HttpContext对象,这个对象在线程中是唯一的,所以我们在Htt

HttpContext请求上下文对象

一.HttpContext概述 HttpContext基于HttpApplication的处理管道,由于HttpContext对象贯穿整个处理过程,所以,可以从HttpApplication处理管道的前端将状态数据传递到管道的后端,完成状态的传递任务. HttpContext的生命周期从服务器接收的HTTP请求开始到反应发送回客户端结束. 在WebForm或类库(包括MVC)项目中,通过Current静态属性,就能够获得HttpContext的对象. HttpContext context =

[译] ASP.NET 生命周期 – ASP.NET 上下文对象(五)

ASP.NET 上下文对象 ASP.NET 提供了一系列对象用来给当前请求,将要返回到客户端的响应,以及 Web 应用本身提供上下文信息.间接的,这些上下文对象也可以用来回去核心 ASP.NET 框架特性. 上下文对象提供了应用,当前请求,与当前请求相关联的响应的信息.也提供了对多数重要的 ASP.NET 平台服务的访问,比如安全与状态数据.我们可以在 MVC 框架的 controllers 和 views 中使用上下文对象来根据当前的请求或者应用状态数据来调整我们应用的响应.在创建模块或者处理

EF上下文对象线程内唯一性与优化

在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用了多个dal层的方法,交互数据库多次,这样效率会低一些,而且在使用EF的情况下,我们通常把SaveChange这个方法提到业务逻辑层(下文中会提到),不保证同一个业务逻辑使用的是同一个上下文对象,事务,工作单元模式将无法实现.而且可能造成数据混乱,每次创建的对象执行相应的数据库操作,与此同时,同一次