适当情况下的 ASP.NET 状态管理

标签 asp.net state

在 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.

最佳答案

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

  • ViewState - 当您经常回发到同一页面时,这很有用(您实际上是被 ASP.Net Webforms 强制执行的操作)。它到底有多有用取决于您正在构建的应用程序类型。对于公共(public)互联网站点,应该非常谨慎地使用它。您甚至可能希望默认将其关闭。对于本地 Intranet 站点,它是一个很棒的工具——尤其是对于较少、较重的 web 表单页面。
  • Query String - 使用它来存储您需要允许用户为页面或进程添加书签并稍后返回的状态。即使这样,您也可能希望将其保留为某种散列,您可以将其用作数据库查找中的键以避免非常大的 url(尽管散列有其自身的问题)。此外,很多用户喜欢直接摆弄您的查询字符串,因此在这里放太多可能会很危险。很容易意外地将数据暴露给不应该以这种方式看到的用户。
  • Application State - 请记住,这是由所有用户共享的,因此请适当使用。观看次数之类的内容可以放在此处。
  • Cookies - 不要使用 cookie 来存储用户凭据。它们只是普通的未加密文本文件。使用 cookie 将 key 存储到 session 中(即使在这里您也可以并且现在应该使用无 cookie session )和特定于该用户和浏览器的简单个性化设置。例如,我工作时的显示器尺寸与家里不同,因此将显示尺寸/布局设置放入 cookie 中很好,因为这些设置适用于每台计算机,但如果其他人读到它,它不会损害我的安全性信息。

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

    you might want to keep it down to some kind of hash that you can use as a key in a database lookup



    同样,哈希也有自己的问题,但我想指出,我列表中的几个项目(包括查询字符串)是关于将数据从客户端 Web 浏览器上传到 Web 服务器的:ViewState、查询字符串、Cookie 和跨页邮政。您希望最小化从客户端移动到服务器的数据。这个概念适用于所有这些,并且有几个原因:
  • 对于公共(public)互联网站点,从客户端提取数据很慢。即使是宽带连接通常也会削弱可用于上传的带宽。与可能位于数据库和 Web 服务器之间的千兆以太网(或更快的)连接相比,512Kpbs(在许多地区仍然是典型的宽带上传速率)根本算不上什么。尽管您可能认为数据库查询很慢(而且确实如此),但它仍然可能比等待来自客户端的相同数据到达要好得多。
  • 将数据保存在服务器上更便宜,因为您无需为将数据推送到客户端或从客户端推送数据所需的带宽付费,而且带宽的成本通常与服务器硬件一样多或更多。
  • 它更安全,因为如果操作正确,即使客户端的计算机或连接受到破坏,黑客最初可以访问的所有哈希 key 也可能在他解密时过期。当然,如果做错了他可以立即直接使用那个 key ,所以你仍然需要小心。

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

    关于适当情况下的 ASP.NET 状态管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1169153/

    相关文章:

    asp.net - 在基本 Controller 中重写 ASP.NET MVC 中的 OnAuthorization

    asp.net - 部署到 Azure 中的网站时如何删除 'site' 目标目录?

    mobile - flutter-如何在flutter中保存状态选择的单选按钮列表?

    android - Flutter:当我可以使用全局变量并改用 setState 时,状态管理库需要什么?

    c# - 在 ASP.NET 中 ConfigureAwait(false) 的行为是什么?

    .net - 引用自 MSDN 关于 System.Web.HttpApplication

    css - 关闭兼容性 View IE11 时链接按钮未触发的问题

    reactjs - React setState 不立即更新

    state - 终极版 : Is it necessary?

    javascript - 为什么 getDerivedStateFromProps 不允许使用状态更新重新渲染? componentWillReceiveProps 不是问题 - ReactJS