2009-07-23 68 views
15

有6种技术来管理ASP.NET 3.5中的状态(据我所知)。ASP.NET状态管理在适当的情况下

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

回答

5

国家管理选项

视图状态:

使用,当你需要存储少量的信息页面将回发到自身。使用ViewState属性提供了具有基本安全性的功能。

控制状态:

使用,当你需要存储少量的状态信息往返于服务器之间的控制。

隐藏字段:

使用,当你需要存储少量的信息页面将回发到自身或到另一个页面,而当安全不是问题。

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

饼干:

使用,当你需要存储少量的客户端和安全性上的信息是不是一个问题。

查询字符串:当你从一个页面少量的信息转移到另一和安全不是问题

使用。

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

服务器端管理选项

应用状态时,你存储所使用的许多用户经常更改,全球信息和安全性是不是一个问题

使用。不要在应用程序状态下存储大量信息。

会话状态

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

配置文件属性

使用,当你存储需要在用户会话过期被持久化,需要在你的应用程序的后续访问再次检索用户特定的信息。

数据库支持

当你存储大量的信息,管理事务,或信息必须经受得住应用和会话使用重新启动。数据挖掘是一个问题,安全性是一个问题。

+0

有关更多详细信息,请访问http://coscientech.blogspot.com或http://msdn.microsoft.com/en-us/library/z1hkazw7.aspx – xxxxxxxxxadfas 2010-09-23 07:46:41

15

有很多可以影响这个因素,所以我不会对所有的人发表意见。但这里有几个要点:

  • ViewState - 当你将发布回到同一页面频繁(东西你几乎被迫通过ASP.Net Web表单做),这非常有用。取决于您正在构建的应用程序类型,它的确切变化有多大用处。对于公共互联网网站,应该非常谨慎地使用它。您甚至可能希望在默认情况下关闭它。对于本地Intranet网站,这是一个很好的工具,特别是对于较少,较重的网页表单页面。

  • Query String - 使用此选项可以存储您需要允许用户为页面或进程添加书签并在稍后返回的状态。即使这样,你也可能希望把它保留在某种散列中,你可以在数据库查找中用它作为关键字,以避免一个真正巨大的url(尽管散列有它们自己的问题)。另外,很多用户都喜欢直接摆弄查询字符串,因此在这里放置太多可能会很危险。不小心将数据暴露给不应该以这种方式看到它的用户。

  • Application State - 请记住,这是所有用户共享的,所以请适当使用。像查看计数这样的事情可以在这里。

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

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

你可能要保持它归结为某种哈希的,你可以在一个数据库作为重点使用查找

此外,哈希有自己的问题,但我想指出的是,在我的名单谈几个项目(包括查询字符串)关于从客户端的Web浏览器将数据上传到网络服务器:ViewState中,查询字符串,Cookie和Cross-Page Post。您希望最小化您从客户端移动到服务器的数据。这个概念适用于所有这些,并有以下几个原因:

  1. 从客户端拉动数据公共互联网网站。即使宽带连接通常会削弱可用于上传的带宽。与可能位于数据库和Web服务器之间的千兆以太网(或更快)连接相比,512Kpbs(在许多地区仍是典型的宽带上传速率)为没有任何。尽管您可能认为数据库查询速度很慢(现在也是如此),但它仍然可能是一个更好的方式,而不是等待来自客户端的相同数据。
  2. 将数据保存在服务器上更便宜,因为您不需要支付将数据发送到客户端或从客户端发送出去所需的带宽,并且带宽的成本通常比服务器硬件的成本高。
  3. 它更安全,因为即使当客户端的计算机或连接受到威胁时,所有黑客最初都可以访问的哈希键可能会在其解密时到期。当然,如果做错了,他可以直接使用该键,所以你仍然需要小心。

因此,对于大多数情况,我推荐的做法是先在Session中保留一个数据库密钥,然后让代码轻松从基于该密钥的数据库中提取所需的代码。当您遇到瓶颈时,配置文件找出它们的位置并开始缓存这些页面或控件,或直接在会话中保留该数据/查询结果。

1

不知道您的意思是应用程序状态下的缓存对象。

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

+0

缓存对象是存储静态数据(或者变化不大但被应用程序引用的任何数据)的好地方,可以防止每次都从数据库或文件系统读取数据。 – Keith 2009-07-23 12:59:36

1

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

1.视图状态

  • 声明:使用尽可能少。好的一点是总是如果可能的话,每个状态都可以通过一个url访问。
    • F.e.分页应使用URL(因此/url/?p=2代替在Viewstate中存储页面)
  • 用于在页面循环之间保持控制状态。
    • F.e.将选中的项目存储在复选框中,以便确定它是否已更改。

2.跨页投递

不要。查看viewstate的免责声明。使用此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;匿名用户的用户首选项(在第二个列表中列出的所有内容)。