- 热门文章:
- · ASP.NET移植须知(续)
- · ASP.NET移植须知
- · 深度剖析Duwamish 7.0 (1--数据结构)
- · 用C#实现无需iiS环境就可以执行aspx文件
- · 解决一个比较奇怪的NET问题的方法
- · asp.net datagrid如何在最后一行作求和:
- · HTTPBrowserCapabilities---在asp.net中显示浏览器属性
- · 将xml作为DataGrid 操作(Sort, Edit, Delete)
- · 使用net classes访问其他网站内容
- · 在asp.net中调用Excel 文件
- · 如何利用RowFilter 属性从一个dataset中创建两个不同的datagrid
- · 使用.NET访问Internet(5) Paul_Ni(原作)(补充)
上一篇:关于上下文-2 (转自msdn) >>
关于上下文-1 (转自msdn)
Susan Warren
Microsoft Corporation
2002年1月14日
编写 Web 应用程序时最常见的问题之一,是要让代码知道它的执行上下文。让我们通过一个简单的例子(即个性化页面)来说明这个问题:
请登录。
与
欢迎 Susan!
虽然看起来很简单,但即使是这一小段 Web UI,仍然需要好几段信息,而且每次请求该页时这些信息都会发生变化。我们需要知道以下内容:
- 用户登录了吗?
- 用户的显示名是什么?
更通常的问题是,每次请求该页时,唯一的上下文是什么?以及如何编写代码以便能考虑到此信息?
事实上,由于 HTTP 的无状态特性,Web 应用程序可能需要跟踪许多不同的上下文片段。当用户与 Web 应用程序交互时,浏览器将一系列独立的 HTTP 请求发送到 Web 服务器。应用程序自身必须将这些请求组织成令用户感到愉悦的体验;同时,知道请求的上下文也十分关键。
ASP 引入了几个内部对象,如 Request 和 Application,以便帮助跟踪 HTTP 请求的上下文。ASP.NET 完成下一步骤,并将这些对象以及其他几个与上下文有关的对象捆绑在一起,形成一个极为方便的内部对象 Context。
Context 是 System.Web.HttpContext(英文)类型的对象。它作为 ASP.NET Page 类的属性公开。也可以通过用户控件和业务对象(下文中详细介绍)获得该对象。以下是 HttpContext 形成的对象的部分列表:
| Application | 值的关键字/值对集合,可由应用程序的每个用户访问。Application 是 System.Web.HttpApplicationState 类型。 |
| ApplicationInstance | 实际运行的应用程序,它公开一些请求处理事件。这些事件在 Global.asax、HttpHandler 或 HttpModule 中处理。 |
| Cache | ASP.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 类型。 |
| Trace | ASP.NET 的 Trace 对象,提供对跟踪功能的访问。有关详细信息,请参阅 Rob 撰写的文章 Tracing(英文)。 |
| User | 当前用户(如果已经过身份验证)的安全上下文。Context.User.Identity 是用户的名称。User 是 System.Security.Principle.IPrincipal 类型的对象。 |
如果您是一位 ASP 开发人员,那么对上面讲述的部分对象应不会感到陌生。虽然有一些改进,但大体而言,它们在 ASP.NET 中的作用与在 ASP 中是完全一样的。
Context 基础知识
Context 中的部分对象也已升级为 Page 中的顶级对象。例如,Page.Context.Response 和 Page.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"]; } }}如何才能在应用程序的每页中添加标准页眉和页脚?
回答:处理应用程序的 BeginRequest 和 EndRequest 事件,并使用 Context.Response.Write 生成页眉和页脚的 HTML。
从技术上讲,可以在 HttpModule 中或通过使用 Global.asax 处理 BeginRequest 这样的应用程序。HttpModules 的编写比较困难,而且正如本例所示,简单应用程序使用的功能通常不使用它。因此,我们使用应用程序范围的 Global.asax 文件。
与 ASP 页一样,一些固有的 ASP.NET 上下文已提升为 HttpApplication 类的属性,其中的类表示 Global.asax 继承类。我们不需要使用 HttpContext.Current 获取对 Context 对象的引用;它在 Global.asax. 中已可用。
本例中,我将 <html> 和 <body> 标记以及一条水平线放入页眉部分,而将另一条水平线及相应的结束标记放入页脚部分。页脚还包含版权消息。运行结果应如下图所示:
http://www.microsoft.com/china/msdn/images/asp01242002-fig01.gif
下一篇:ASP.NET移植须知(续) >>
相关文章:
- · 使用.NET访问Internet(5) Paul_Ni(原作)
- · 使用.NET访问Internet(4) Paul_Ni(原作)(补充)
- · 使用.NET访问 Internet(3) Paul_Ni(原作)
- · 使用.NET访问Internet(4) Paul_Ni(原作)
- · 使用.NET访问 Internet(2) Paul_Ni(原作)
- · 修改后的Whois查询程序
- · 使用.NET访问 Internet(1) Paul_Ni(原作)
- · 如何取得动态装载的WEB CONTROL的属性值?
- · POP3 Client as a C# Class(转自CodeProject)
- · 饼图的一种画法(转载自aspcool)
- · 精品:Asp3.0中email有效性验证
- · 使用Div加速页面的显示(原创)
- · Creating DataGrid Templated Columns Dynamically - Part I(转自Dotnettips)
- · 关于asp.net的代码重用
- · Getting Datagrid Columns Keypress,Keyup, Keydown and other events to Fire(一个很好的东西)
- · runat=server
- · 关于上下文(Context)/2(转MS)
- · 关于上下文(Context)/1(转MS)
- · 在.NET中使用静态变量来代替Application变量
- · ASP.NET窗体对话框的实现
- · 用.NET创建定时缓存
- · 将Session值储存于SQL Server中
- · ASP.NET中的事务处理和异常处理
- · ASP.NET Caching /2
- · 嘿,懒鬼!!其实MSDN阐述得真得不错哎,不知道你从哪来的资料
- · ASP.NET Caching /1
- · 绝对酷,如何解决asp.net中javascript脚本的问题(使用服务器控件执行客户端脚本)
- · 最佳ASP.NET编程习惯
- · 一次同时上传多个文件
- · 在datagrid中求和(vb.net,c#)
- · ASP.NET中利用SQLXML WEB服务访问XML数据(转)
- · 在DataGrid中经弹出窗口确认后执行操作(删除)。(附在DataGrid中修改,添加记录)详见代码!!
- · 在datagrid中放入一个DropDownList(忘了这个问题在那里看到的了CSDN or There)
- · 简单的动态加载用户控件的方法
- · 关于如何 确认删除的另外一个办法。
- · 掉掉注意了,如何动态加载用户控件(ascx)
- · 给大家一个新的加密方法,C#的。(国外的,只用于学习,支持中文)
- · TO feixr,DataGrid中的Radiobutton
