15

在 ASP.NET 3.5 中有 6 种技术来管理状态(据我所知)。

(1) View State
(2) Cross Page Posting
(3) Query String
(4) Session State
(5) Application State
(6) Cookies

谁能给我一些适当的例子来说明我应该使用这些技术的情况?

例如:

(*) Session State: Personalization, Buy Cart, etc.
(*) Cookies: Saving User Credentials, etc.
4

4 回答 4

15

有很多因素可以影响这一点,所以我不会对所有因素发表评论。但这里有一些提示:

  • ViewState- 当您经常回发到同一页面时,这很有用(您实际上是被 ASP.Net Webforms 强制执行的操作)。它到底有多有用取决于您正在构建的应用程序类型。对于公共互联网站点,应该非常谨慎地使用它。您甚至可能希望默认将其关闭。对于本地 Intranet 站点,它是一个很棒的工具——尤其是对于较少、较重的 web 表单页面。

  • Query String- 使用它来存储您需要允许用户为页面或进程添加书签并稍后返回的状态。即使这样,您也可能希望将其保留为某种散列,您可以将其用作数据库查找中的键以避免非常大的 url(尽管散列有其自身的问题)。此外,很多用户喜欢直接摆弄您的查询字符串,因此在这里放太多可能会很危险。很容易意外地将数据暴露给不应该以这种方式看到的用户。

  • Application State- 请记住,这是由所有用户共享的,因此请适当使用。观看次数之类的内容可以放在此处。

  • Cookies- 不要使用 cookie 来存储用户凭据。它们只是普通的未加密文本文件。使用 cookie 将密钥存储到会话中(即使在这里您也可以并且现在应该使用无 cookie 会话)和特定于该用户和浏览器的简单个性化设置。例如,我工作时的显示器尺寸与家里不同,因此将显示尺寸/布局设置放入 cookie 中很好,因为这些设置适用于每台计算机,但如果其他人读到它,它不会损害我的安全性信息。

现在我想从“查询字符串”部分强调这个概念:

您可能希望将其保留为可以用作数据库查找中的键的某种散列

同样,哈希也有自己的问题,但我想指出,我列表中的几个项目(包括查询字符串)是关于将数据从客户端 Web 浏览器上传到 Web 服务器的:ViewState、查询字符串、Cookie 和跨页邮政。您希望最小化从客户端移动到服务器的数据。这个概念适用于所有这些,并且有几个原因:

  1. 对于公共互联网站点,从客户端提取数据很慢。即使是宽带连接通常也会削弱可用于上传的带宽。与可能位于数据库和 Web 服务器之间的千兆以太网(或更快的)连接相比,512Kpbs(在许多地区仍然是典型的宽带上传速率)根本算不上什么。尽管您可能认为数据库查询很慢(而且确实如此),但它仍然可能比等待来自客户端的相同数据到达要好得多。
  2. 将数据保存在服务器上更便宜,因为您无需为将数据推送到客户端或从客户端推送数据所需的带宽付费,而且带宽的成本通常与服务器硬件一样多或更多。
  3. 它更安全,因为如果操作正确,即使客户端的计算机或连接受到破坏,黑客最初可以访问的所有哈希密钥也可能在他解密时过期。当然,如果做错了他可以立即直接使用那个密钥,所以你仍然需要小心。

因此,对于大多数事情,我建议首先在 Session 中保留一个数据库密钥,然后编写代码以根据该密钥轻松地从数据库中提取您需要的内容。当您遇到瓶颈时,分析以找出它们的位置并开始缓存这些页面或控件,或者直接将数据/查询结果保存在会话中。

于 2009-07-23T02:18:31.347 回答
5

状态管理选项

查看状态:

当您需要为将回发给自身的页面存储少量信息时使用。使用 ViewState 属性可提供具有基本安全性的功能。

控制状态:

当您需要为往返服务器之间的控件存储少量状态信息时使用。

隐藏字段:

当您需要为将回发到自身或另一个页面的页面存储少量信息并且安全不是问题时使用。

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

饼干:

当您需要在客户端上存储少量信息并且安全不是问题时使用。

请求参数:

当您将少量信息从一个页面传输到另一个页面并且安全不是问题时使用。

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

服务器端管理选项

应用状态

当您存储不经常更改的、被许多用户使用的全局信息并且安全不是问题时使用。不要在应用程序状态下存储大量信息。

会话状态

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

配置文件属性

当您存储用户特定的信息时使用,这些信息需要在用户会话过期后保留,并且需要在后续访问您的应用程序时再次检索。

数据库支持

当您存储大量信息、管理事务或信息必须在应用程序和会话重新启动后仍然存在时使用。数据挖掘是一个问题,安全性是一个问题。

于 2010-09-22T20:55:46.003 回答
1

不确定您是否指的是应用程序状态的缓存对象。

Cache 对象是管理应用程序范围状态的好方法,例如记录对您网站的访问的来源和计数(例如防止 DDOS 攻击)。

于 2009-07-23T02:28:12.050 回答
1

(3) 查询字符串 (4) 会话状态 (5) 应用程序状态 (6) Cookie

1. 视图状态

  • 免责声明:尽量少用。好的一点是,如果可能的话,总是让每个状态都可以通过 url 访问。
    • Fe Paging 应该使用 URL(/url/?p=2而不是将页面存储在 Viewstate 中)
  • 用于在页面周期之间保持控制状态。
    • Fe 将选中的项目存储在一个复选框中,以便您确定它是否已更改。

2. 跨页发帖

不。查看视图状态的免责声明。为此使用 URL,或者如果需要保留大量属性,则将数据存储在会话/cookie/配置文件中。

CPP 的主要缺点是用户无法在其网络浏览器中使用“后退”和“前进”按钮。当用户单击后退按钮时,它希望撤消该页面上的所有内容并重试最后一个。当使用 CPP 通过向导点击它们时;如果没有大量“您确定要重新发送 blablablabl”,这种行为是不可能的。

3.查询字符串

大量使用。页面可以到达的每个可见状态都应该可以通过 URL 访问。有屏幕阅读器的人会为此感谢你。通过使用查询字符串,无需使用纯 javascript 解决方案。

/url/?page=2    // when doing paging, don't use postback for this
/url/?tab=advanced-search    // when having tabs on top of your page

等等

4.会话状态

将此用于短期对象,仅在访问者访问您的站点时才有意义。例如:

  • 到达某个向导的哪一步
  • 用户之前访问过的页面
  • 您想放入缓存中但受用户限制的小对象

不要使用会话,而是将配置文件用于以下内容:

  • 优先
  • 选择的语言

因为这些事情在用户下次访问您的网站时也有意义。

5.应用状态

绝不。为此使用 ASP.NET 缓存、memcached 或任何缓存框架。

6. 饼干

认证用户的会话 ID、配置文件 ID;匿名用户的用户偏好(4. 下第二个列表中列出的所有内容)。

于 2010-09-29T12:13:47.727 回答