关于上下文(Context)/1(转MS)

关于上下文
Susan Warren
Microsoft Corporation
2002年1月14日

编写 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.NET 的 Trace 对象,提供对跟踪功能的访问。有关详细信息,请参阅 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 SystemImports System.WebNamespace Context   ' 演示从业务类中生成一个 ASP.NET    ' 跟踪语句。   Public Class TraceEmit            Public Sub SomeMethod()                  ' 获取请求上下文         Dim _context As HttpContext = HttpContext.Current                  ' 使用上下文编写跟踪语句         _context.Trace.Write("在 TraceEmit.SomeMethod 中")      End Sub   End ClassEnd 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 SystemImports System.WebNamespace 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 ClassEnd 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。
从技术上讲,可以在 HttpModule 中或通过使用 Global.asax 处理 BeginRequest 这样的应用程序。HttpModules 的编写比较困难,而且正如本例所示,简单应用程序使用的功能通常不使用它。因此,我们使用应用程序范围的 Global.asax 文件。
与 ASP 页一样,一些固有的 ASP.NET 上下文已提升为 HttpApplication 类的属性,其中的类表示 Global.asax 继承类。我们不需要使用 HttpContext.Current 获取对 Context 对象的引用;它在 Global.asax. 中已可用。
本例中,我将 <html> 和 <body> 标记以及一条水平线放入页眉部分,而将另一条水平线及相应的结束标记放入页脚部分。页脚还包含版权消息。运行结果应如下图所示:

图 1:浏览器中呈现的标准页眉和页脚示例
这是一个简单的示例,但您可以很容易地将它扩展,使其包含标准的页眉与导航,或者仅输出相应的 <!-- #include ---> 语句。请注意,如果希望页眉或页脚包含交互内容,应考虑使用 ASP.NET 用户控件。

[SomePage.aspx 源代码 - 内容示例]

<FONT face="Arial" color="#cc66cc" size="5">常规页面内容</FONT>

[Visual Basic Global.asax]

<%@ Application Language="VB" %><script runat="server">      Sub Application_BeginRequest(sender As Object, e As EventArgs)         ' 生成页眉         Context.Response.Write("<html>" + ControlChars.Lf + _"<body bgcolor=#efefef>" + ControlChars.Lf + "<hr>" + _ ControlChars.Lf)      End Sub                   Sub Application_EndRequest(sender As Object, e As EventArgs)         ' 生成页脚         Context.Response.Write("<hr>" + ControlChars.Lf + _      "2002 Microsoft Corporation 版权所有" + _      ControlChars.Lf + "</body>" + ControlChars.Lf + "</html>")      End Sub </script>

[C# Global.asax]

<%@ Application Language="C#" %><script runat="server">        void Application_BeginRequest(Object sender, EventArgs e) {            // 生成页眉            Context.Response.Write("<html>\n<body bgcolor=#efefef>\n<hr>\n");        }        void Application_EndRequest(Object sender, EventArgs e) {            // 生成页脚            Context.Response.Write("<hr>\2002 Microsoft Corporation 版权所有\n");            Context.Response.Write("</body>\n</html>");        }</script>

如何在用户经过身份验证后显示欢迎信息?

回答:测试 User 上下文对象以查看用户是否经过身份验证。如果是,还要从 User 对象获取用户名。当然,这是本文开头的示例。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, context
, response
, httpcontext
, 页眉
, 获取response对象
, 上下文
, asp.net(c#)有关
获取context
context上下文、context上下文 详解、java context上下文、docker context上下文、context转activity,以便于您获取更多的相关知识。

时间: 2024-10-30 06:08:55

关于上下文(Context)/1(转MS)的相关文章

强悍的上下文Context

在一个框架中,许多地方都要用到上下文(Context),可以说上下文的实现是否到位,直接关系到开发的便捷性及访问效率. 什么是上下文呢?上下文可以认为是在访问者和被访问者之间进行信息传递的纽带.一般的,我们函数之间调用时通过函数参数及返回值来做做数据的传入和传出,但是,这样就会出现不同访问之间的参数都是不同的,在程序中访问的时候,这当然没有问题.但是对于框架来说,它事件不知道你要用什么方式调用,提供的函数及返回值是什么也不知道,这个时候一般来说,会提供一个上下文(Context)来提供数据传入和

Javascript的“上下文”(context)

一:JavaScript中的"上下文"指的是什么 百科中这样定义: 上下文是从英文context翻译过来,指的是一种环境. 在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境. 在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等.又比如计算机技术中,相对于进程而言,上下文就是进程执行时的环境. 具体来说就是各个变量和数据,包括所有的寄存器变量.进程打开的文件.内存信息等.   JavaScript的执行上下文的理解是一

笔记 - Android - 6.上下文Context API

Context API:          File getFileDir():返回/data/data/应用程序包名/files 目录(应用程序的files目录)     File getCacheDir():返回/data/data/应用程序包名/cache 目录(应用缓存目录)          ------------          FileOutputStream openFileOutput(String name, int mode):创建一个输出流对象         > n

Javascript 中的上下文,我的认识的三个阶段

js 中的 上下文 Context,可以说是一个,你即使不知道,没听过,也不影响你继续写 js 代码的一个概念.但是,它又确确实实是无所不在的一个东西,是的,无所不在. 从我自己的经验来看,对上下文的认识,算是分成了三个阶段,每一个阶段,都让我从外在的表现中,理解了一些更本质上的东西. 第一阶段,不知 我最开始接触 js 的时候,看到了它的 new ,看到了它的 this ,很自然地会把 js 和其它的一些 OOP 语言等同起来看待,并且,好像,也是这么回事.比如: var Class = fu

用户空间与内核空间,进程上下文与中断上下文[总结]

1.前言 最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文.看着很熟悉,半天又说不出到底是怎么回事,有什么区别.看书过程经常被感觉欺骗,似懂非懂的感觉,很是不爽,今天好好结合书和网上的资料总结一下,加深理解. 2.用户空间与内核空间 我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保

基于 TensorFlow 的上下文机器人

本文讲的是基于 TensorFlow 的上下文机器人, 原文地址:Contextual Chatbots with Tensorflow 原文作者:gk_ 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO/contextual-chat-bots-with-tensorflow.md 译者:edvardhua 校对者:lileizhenshuai, jasonxia23 基于 TensorFlow 的上下

final-Andoid如何获取string字符串,在一个类中没有context

问题描述 Andoid如何获取string字符串,在一个类中没有context 我们都知道,Android中在一个Activity或是service中可以用this.getString(R.string,test);来获取字符串,但如果这样呢? publicclass myTestClass{ public static final String MYTEST = "this is a test"; //如果这个字符串是在string.xml中,该如何获取该值 //this.getSt

jQuery技术内幕:深入解析jQuery架构设计与实现原理. 3.4 Sizzle( selector, context, results, seed )

3.4 Sizzle( selector, context, results, seed ) 函数Sizzle( selector, context, results, seed )用于查找与选择器表达式selector匹配的元素集合.该函数是选择器引擎的入口. 函数Sizzle( selector, context, results, seed )执行的6个关键步骤如下: 1)解析块表达式和块间关系符. 2)如果存在位置伪类,则从左向右查找: a.?查找第一个块表达式匹配的元素集合,得到第一个

Linux Context , Interrupts 和 Context Switching 说明【转】

转自:http://blog.csdn.net/tianlesoftware/article/details/6461207 一. 进程Context 定义        当一个进程在执行时, CPU的所有寄存器中的值.进程的状态以及堆栈中的内容,比如各个变量和数据,包括所有的寄存器变量.进程打开的文件.内存信息等.这些信息被称为该进程的上下文(Context).          一个进程的Context可以分为三个部分:用户级上下文.寄存器上下文以及系统级上下文:        (1)用户级

.NET面向上下文、AOP架构模式(实现)

1.上下文Context.面向切面编程AOP模型分析 在本人的.NET面向上下文.AOP架构模式(概述)一文中,我们大概了解了上下文如何辅助对象在运行时的管理.在很多时候我们急需在运行时能把对象控制在一定的逻辑范围内,在必要的时候能让他们体现出集中化的概念,如人群.车辆.动物等等.而Context与AOP有着密切的联系,Context表示逻辑抽象的范围而AOP描述了在这个逻辑范围内如何进行控制.其实这两者都是设计模式外的设计模式,与具体的技术实现无关.[王清培版权所有,转载请给出署名] 那么Co