HTTP上下文_HttpContext
来源:互联网 发布:linux 串口登陆 编辑:程序博客网 时间:2024/06/18 17:16
编写 Web 应用程序时最常见的问题之一,是要让代码知道它的执行上下文。让我们通过一个简单的例子(即个性化页面)来说明这个问题:
请登录。
与
欢迎 Susan!
虽然看起来很简单,但即使是这一小段 Web UI,仍然需要好几段信息,而且每次请求该页时这些信息都会发生变化。我们需要知道以下内容:
- 用户登录了吗?
- 用户的显示名是什么?
更通常的问题是,每次请求该页时,唯一的上下文是什么?以及如何编写代码以便能考虑到此信息?
事实上,由于 HTTP 的无状态特性,Web 应用程序可能需要跟踪许多不同的上下文片段。当用户与 Web 应用程序交互时,浏览器将一系列独立的 HTTP 请求发送到 Web 服务器。应用程序自身必须将这些请求组织成令用户感到愉悦的体验;同时,知道请求的上下文也十分关键。
ASP 引入了几个内部对象,如 Request 和 Application,以便帮助跟踪 HTTP 请求的上下文。ASP.NET 完成下一步骤,并将这些对象以及其他几个与上下文有关的对象捆绑在一起,形成一个极为方便的内部对象 Context。
Context 是 System.Web.HttpContext(英文)类型的对象。它作为 ASP.NET Page 类的属性公开。也可以通过用户控件和业务对象(下文中详细介绍)获得该对象。以下是 HttpContext 形成的对象的部分列表:
如果您是一位 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> 标记以及一条水平线放入页眉部分,而将另一条水平线及相应的结束标记放入页脚部分。页脚还包含版权消息。运行结果应如下图所示:
图 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 对象获取用户名。当然,这是本文开头的示例。
- HTTP上下文_HttpContext
- flex 获取http路径及上下文根
- 上下文
- 上下文
- HttpComponents —— HTTP上下文环境(HttpContext)
- WebWork-ActionContext(Action上下文) (http://www.cnblogs.com/suibing/articles/791114.html)
- PDP 上下文 (2011-03-31 17:40:27) http://blog.sina.com.cn/s/blog_798a531d0100qe9q.html
- 进程上下文,中断上下文
- 进程上下文&中断上下文
- 进程上下文 & 中断上下文
- 进程上下文 & 中断上下文
- 中断上下文、进程上下文
- 进程上下文、中断上下文
- 进程上下文 & 中断上下文
- 进程上下文 中断上下文
- 中断上下文、进程上下文
- 进程上下文 & 中断上下文
- 应用上下文&请求上下文
- 看看吧
- 如何判断文章是否被EI收录
- 新浪换标,也许应该做点什么了
- Application Architecture Guide 2.0 学习笔记(一)前言 - Quality Attributes
- IT技术中的言情小说
- HTTP上下文_HttpContext
- 【BASH】如何防止在重定向时覆盖现有文件
- 用代码给DataGridView添加新行
- 检测各种浏览器、系统的JS代码
- JAVA完全控制Oracle中BLOB CLOB说明
- 如何构建CMDB?
- 分页:页码显示javascript
- Google App Engine Support Java™ Language
- 世界上最牛的程序员