65.9K
CodeProject 正在变化。 阅读更多。
Home

状态管理

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.92/5 (3投票s)

2006年10月5日

7分钟阅读

viewsIcon

23166

Web 窗体页是基于 HTTP 的,它们是无状态的,这意味着它们不知道请求是否来自同一个客户端,并且页面在每次往返服务器时都会被销毁和重新创建,因此信息会丢失,所以状态管理在 Web 应用程序开发中确实是一个问题。

ASP.NET 中的状态管理

Web 窗体页是基于 HTTP 的,它们是无状态的,这意味着它们不知道请求是否来自同一个客户端,并且页面在每次往返服务器时都会被销毁和重新创建,因此信息会丢失,所以状态管理在 Web 应用程序开发中确实是一个问题。

我们可以用 cookie、查询字符串、应用程序、会话等轻松地在 ASP 中解决这些问题。现在在 ASP.NET 中,我们仍然可以使用这些功能,但它们更丰富、更强大,所以让我们深入研究一下。

管理 Web 页状态主要有两种不同的方法:客户端和服务器端。

1. 客户端状态管理:

在服务器和客户端之间的往返过程中,服务器上不维护任何信息。信息将存储在页面或客户端计算机上。

A. Cookies。

Cookie 是少量数据,存储在客户端文件系统中的文本文件或客户端浏览器会话的内存中。Cookie 主要用于跟踪数据设置。让我们举个例子:假设我们要自定义一个欢迎网页,当用户请求默认网页时,应用程序首先检测用户是否以前登录过,我们可以从 cookie 中检索用户信息:
[c#]
if (Request.Cookies[“username”]!=null)
lbMessage.text=”Dear “+Request.Cookies[“username”].Value+”, Welcome shopping here!”;
else
lbMessage.text=”Welcome shopping here!”;

如果你想存储客户端的信息,可以使用以下代码:
[c#]
Response.Cookies[“username’].Value=username;

所以下次用户请求网页时,你就可以轻松地再次识别用户。

B. 隐藏字段

隐藏字段在浏览器中不可见,但你可以像设置标准控件一样设置它的属性。当页面提交到服务器时,隐藏字段的内容将与其它控件的值一起发送到 HTTP Form 集合中。隐藏字段充当任何你希望直接存储在页面中的页面特定信息的存储库。隐藏字段在它的 **value** 属性中存储单个变量,并且必须显式地添加到页面。
ASP.NET 提供了 **HtmlInputHidden** 控件,它提供了隐藏字段功能。
[c#]
protected System.Web.UI.HtmlControls.HtmlInputHidden Hidden1;
//为隐藏字段赋值
Hidden1.Value=”this is a test”;
//检索值
string str=Hidden1.Value;

注意:请记住,为了使用隐藏字段,您必须使用 HTTP-Post 方法提交 Web 页。尽管它的名称是“隐藏”,但它的值不是隐藏的,您可以通过“查看源代码”功能看到它的值。

C. View State


Web 窗体页上的每个控件,包括页面本身,都有一个 **ViewState** 属性。它是一个内置结构,用于自动保留页面和控件的状态,这意味着在页面提交到服务器后,您无需执行任何操作即可恢复控件的数据。

在这里,对我们有用的是 ViewState 属性,我们可以使用它在与服务器的往返之间保存信息。
[c#]
//保存信息
ViewState.Add(“shape”,”circle”);
//检索信息
string shapes=ViewState[“shape”];

注意:与隐藏字段不同,ViewState 中的值在“查看源代码”时是不可见的,它们被压缩和编码。

D. 查询字符串

查询字符串提供了一种简单但有限的方式来维护一些状态信息。您可以轻松地将信息从一个页面传递到另一个页面。但是大多数浏览器和客户端设备对 URL 的长度都有 255 个字符的限制。此外,查询值通过 URL 暴露给 Internet,因此在某些情况下安全性可能是一个问题。
带有查询字符串的 URL 可能如下所示:

http://www.examples.com/list.aspx?categoryid=1&productid=101

当请求 list.aspx 时,可以使用以下代码获取类别和产品信息:
[c#]
string categoryid, productid;
categoryid=Request.Params[“categoryid”];
productid=Request.Params[“productid”];

注意:您只能使用 HTTP-Get 方法提交 Web 页,否则将永远无法从查询字符串中获取值。

2. 服务器端状态管理:

信息将存储在服务器上,安全性更高,但会消耗更多 Web 服务器资源。

A. Application 对象

Application 对象提供了一种存储数据机制,该机制可供 Web 应用程序中的所有代码访问。最适合插入应用程序状态变量的数据是多个会话共享且不经常更改的数据。由于它对整个应用程序可见,因此您需要使用 Lock 和 UnLock 对来避免值冲突。

[c#]

Application.Lock();

Application[“mydata”]=”mydata”;

Application.UnLock();

B. Session 对象


Session 对象可用于存储需要在服务器往返和页面请求之间维护的特定于会话的信息。Session 对象是按客户端划分的,这意味着不同的客户端会生成不同的 Session 对象。最适合存储在会话状态变量中的数据是短暂的、敏感的、并且特定于单个会话的数据。

每个活动的 ASP.NET 会话都通过包含 URL 安全 ASCII 字符的 120 位 **SessionID** 字符串进行标识和跟踪。**SessionID** 值使用保证唯一性的算法生成,以避免会话冲突,并且 SessionID 的随机性使得猜测现有会话的 SessionID 变得更加困难。
SessionIDs 根据应用程序的配置设置,通过 HTTP cookie 或修改后的 URL 在客户端-服务器请求之间进行通信。那么如何在应用程序配置中设置会话设置呢?好的,让我们进一步看看。

每个 Web 应用程序都必须有一个名为 web.config 的配置文件,它是一个基于 XML 的文件,其中有一个名为 'sessionState' 的部分,示例如下:

<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20" />

“cookieless”选项可以是“true”或“false”。当它是“false”(默认值)时,ASP.NET 将使用 HTTP cookie 来标识用户。当它是“true”时,ASP.NET 将随机生成一个唯一的数字并将其放在请求文件的正前面,这个数字用于标识用户,您可以在 IE 的地址栏中看到它:

https:///Management/(2yzakzez3eqxut45ukyzq3qp)/Default.aspx

好的,我们已经讲得够多了,让我们回到 Session 对象。
[c#]
//存储信息
Session[“myname”]=”Mike”;
//检索信息
myname=Session[“myname”];

C. 数据库


数据库使您能够存储 Web 应用程序中大量的状态信息。有时用户会不断地通过使用唯一的 ID 查询数据库,您可以将其保存在数据库中,以便在您的网站的页面进行多次请求时使用。

总结


ASP.NET 拥有比 ASP 更多的功能和实用工具,可以使您更有效、更高效地管理页面状态。选择哪种选项将取决于您的应用程序,在做出任何选择之前,您必须考虑以下几点:

  • 您需要存储多少信息?
  • 客户端是否接受持久性 cookie 或内存 cookie?
  • 您想将信息存储在客户端还是服务器端?
  • 信息是否敏感?
  • 您期望从您的页面获得什么样的性能体验?

客户端状态管理总结

方法

何时使用

Cookies

您需要在客户端存储少量信息,并且安全性不是问题。

View state

您需要为会回发到自身的页面存储少量信息。使用 **ViewState** 属性可以提供半安全的功能。

Hidden fields

您需要为会回发到自身或另一个页面的页面存储少量信息,并且安全性不是问题。

注意   您只能在提交到服务器的页面上使用隐藏字段。

Query string

您正在将少量信息从一个页面传输到另一个页面,并且安全性不是问题。

注意   只有在请求相同页面或通过链接请求另一个页面时,您才能使用查询字符串。

服务器端状态管理总结

方法

何时使用

Application state object

您正在存储不经常更改的、应用程序范围的信息,这些信息由许多用户使用,并且安全性不是问题。不要在应用程序状态对象中存储大量信息。

Session state object

您正在存储对单个会话而言是短暂的信息,并且安全性是一个问题。不要在会话状态对象中存储大量信息。请注意,会话状态对象将在您应用程序的每个会话的生命周期内创建和维护。在托管大量用户的应用程序中,这会占用大量的服务器资源并影响可伸缩性。

Database support

您正在存储大量信息、管理事务,或者信息必须在应用程序和会话重启后仍然存在。数据挖掘是一个考虑因素,并且安全性是一个问题。

开发 ASP.NET 程序真的很有趣,一旦您开始学习,您就能感受到它的强大。下次我们将讨论另一个话题:缓存。享受 .Net!!

 

 

 

 

 

© . All rights reserved.