关于上下文(Context)

编写 Web 应用程序时最常见的问题之一,是要让代码知道它的执行上下文。让我们通过一个简单的例子(即个性化页面)来说明这个问题:

     请登录。

     欢迎 Susan!

虽然看起来很简单,但即使是这一小段 Web UI,仍然需要好几段信息,而且每次请求该页时这些信息都会发生变化。我们需要知道以下内容:

  1. 用户登录了吗?
  2. 用户的显示名是什么?

更通常的问题是,每次请求该页时,唯一的上下文是什么?以及如何编写代码以便能考虑到此信息?

事实上,由于 HTTP 的无状态特性,Web 应用程序可能需要跟踪许多不同的上下文片段。当用户与 Web 应用程序交互时,浏览器将一系列独立的 HTTP 请求发送到 Web 服务器。应用程序自身必须将这些请求组织成令用户感到愉悦的体验;同时,知道请求的上下文也十分关键。

ASP 引入了几个内部对象,如 RequestApplication,以便帮助跟踪 HTTP 请求的上下文。ASP.NET 完成下一步骤,并将这些对象以及其他几个与上下文有关的对象捆绑在一起,形成一个极为方便的内部对象 Context

Context System.Web.HttpContext(英文)类型的对象。它作为 ASP.NET Page 类的属性公开。也可以通过用户控件和业务对象(下文中详细介绍)获得该对象。以下是 HttpContext 形成的对象的部分列表:

对象说明
Application值的关键字/值对集合,可由应用程序的每个用户访问。Application 是 System.Web.HttpApplicationState 类型。
ApplicationInstance实际运行的应用程序,它公开一些请求处理事件。这些事件在 Global.asax、HttpHandler 或 HttpModule 中处理。
CacheASP.NET Cache 对象,它提供对缓存的编程访问。Rob Howard 的 ASP.NET Caching 专栏(英文)对缓存作了详尽介绍。
Error处理页时遇到的第一个错误(如果有)。有关详细信息,请参阅 Rob 撰写的 Exception to the Rule, Part 1(英文)。
Items关键字/值对集合,可以用来在参与处理同一请求的所有组件之间传递信息。Items 是 System.Collections.IDictionary 类型。
Request有关 HTTP 请求的信息,包括浏览器信息、Cookies 以及在窗体或查询字符串中传递的值。Request 是 System.Web.HttpRequest 类型。
Response用于创建 HTTP 响应的设置和内容。Response 是 System.Web.HttpResponse 类型。
Server服务器是一个实用程序类,带有一些有用的帮助器方法,包括 Server.Execute()Server.MapPath()Server.HtmlEncode()。Server 是 System.Web.HttpServerUtility 类型的对象。
Session值的关键字/值对集合,可由应用程序的单个用户访问。Session 是 System.Web.HttpSessionState 类型。
TraceASP.NETTrace 对象,提供对跟踪功能的访问。有关详细信息,请参阅 Rob 撰写的文章 Tracing(英文)。
User当前用户(如果已经过身份验证)的安全上下文。Context.User.Identity 是用户的名称。User 是 System.Security.Principle.IPrincipal 类型的对象。

如果您是一位 ASP 开发人员,那么对上面讲述的部分对象应不会感到陌生。虽然有一些改进,但大体而言,它们在 ASP.NET 中的作用与在 ASP 中是完全一样的。

Context 基础知识

Context 中的部分对象也已升级为 Page 中的顶级对象。例如,Page.Context.ResponsePage.Response 指的是同一个对象,因此,以下代码是等价的:

[Visual Basic® Web 窗体]
   Response.Write ("您好")

   Context.Response.Write ("你好")

[C# Web 窗体]
   Response.Write ("您好");

   Context.Response.Write ("你好");

还可以从业务对象使用 Context 对象。HttpContext.Current 是静态属性,可以很方便地返回当前请求的上下文。这在各种方法中都十分有用,下面仅列举一个从业务类的缓存中检索项目的简单示例:

[Visual Basic]
      ' 获取请求上下文

      Dim _context As HttpContext = HttpContext.Current



   ' 获取缓存中的数据集

   Dim _data As DataSet = _context.Cache("MyDataSet")

[C#]
      // 获取请求上下文

      HttpContext _context = HttpContext.Current;



   // 获取缓存中的数据集

   DataSet _data = _context.Cache("MyDataSet");

操作中的 Context

Context 对象为一些常见的 ASP.NET“如何…?”问题提供了答案。也许,说明此宝贵对象的价值的最好方法,就是在操作中将它展示出来。下面是一些我所知道的最巧妙的 Context 技巧。

我如何从自己的业务类中生成 ASP.NET 跟踪语句?

回答:很简单!使用 HttpContext.Current 获取 Context 对象,然后调用 Context.Trace.Write()

[Visual Basic]
Imports System

Imports System.Web



Namespace Context



   ' 演示从业务类中生成一个 ASP.NET 

   ' 跟踪语句。



   Public Class TraceEmit

      

      Public Sub SomeMethod()

         

         ' 获取请求上下文

         Dim _context As HttpContext = HttpContext.Current

         

         ' 使用上下文编写跟踪语句

         _context.Trace.Write("在 TraceEmit.SomeMethod 中")



      End Sub



   End Class



End Namespace   

[C#]
using System;

using System.Web;



namespace Context

{

   // 演示从业务类中生成一个 ASP.NET 

   // 跟踪语句。



   public class TraceEmit

   {



        public void SomeMethod() {

        

            // 获取请求上下文

            HttpContext _context = HttpContext.Current;



            // 使用上下文编写跟踪语句

            _context.Trace.Write("在 TraceEmit.SomeMethod 中");

        }

    }

}

如何才能从业务类中访问会话状态值?

回答:很简单!使用 HttpContext.Current 获取 Context 对象,然后访问 Context.Session

[Visual Basic]
Imports System

Imports System.Web



Namespace Context



   ' 演示从业务类中访问 ASP.NET 内部

   ' 会话。



   Public Class UseSession

   

      Public Sub SomeMethod()

         

         ' 获取请求上下文

         Dim _context As HttpContext = HttpContext.Current

         

         ' 访问内部会话

         Dim _value As Object = _context.Session("TheValue")



      End Sub



   End Class



End Namespace

[C#]
using System;

using System.Web;



namespace Context

{

   // 演示从业务类中访问 ASP.NET 内部 

   // 会话



   public class UseSession

   {



        public void SomeMethod() {

        

            // 获取请求上下文

            HttpContext _context = HttpContext.Current;



            // 访问内部会话

            object _value = _context.Session["TheValue"];

        }

    }

}

如何才能在应用程序的每页中添加标准页眉和页脚?

回答:处理应用程序的 BeginRequestEndRequest 事件,并使用 Context.Response.Write 生成页眉和页脚的 HTML 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值