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

缓存、会话和视图状态

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.62/5 (28投票s)

2008年6月3日

GPL3

5分钟阅读

viewsIcon

166310

downloadIcon

1111

在您的 ASP.NET 应用程序中正确使用缓存、会话和视图状态对象

下载 SampleCacheSessionViewState.zip - 5.08 KB

理解缓存、会话和视图状态之间的区别

本文最初发表于 http://www.progtalk.com/ViewArticle.aspx?ArticleID=62

本文将讨论不同类型的存储方法,以及哪种方法最适合您的网站。随着 Web 应用程序和开发人员数量的增长,对于应该使用哪种存储方法以及何时使用似乎存在误解。不正确的开发策略可能会导致严重的后果,从而导致客户和访问者的流失。让我们首先检查不同的方法。

理解缓存

缓存可以被认为是内存。它简单来说就是运行源代码的机器/服务器的内存。这是一个极其重要的功能,它可以让您存储难以构造的复杂数据,这些数据可以被重用。

想象一下,您必须查询一组大型的不同数据库,这些数据库可能包含来自 MySQL、MSSQL 到 ORACLE 的记录,这些记录使用 VB.NET 或 C# 代码连接。现在,如果记录每隔几个小时只发生微不足道的变化,我们为什么需要在用户每次想要获取信息时都进行实时获取/查找?首先,它会很慢,并且占用大量资源,因为我们必须在向用户显示所有数据之前重新构建所有数据。通过使用缓存,我们可以将其存储在内存中,并直接绑定数据。这将是一种更优雅、更有效的数据检索方式,同时保持最佳性能。

缓存对象还可以设置过期时间,这将允许我们定期将数据重新加载到内存中。使用与上述相同的示例,我们可以将缓存设置为每两小时过期一次,并重新填充数据。它将在全天每隔两小时执行此操作,从而获取最新数据。下面是如何将数据放入缓存的示例

// 引用自 MSDN http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx

public void AddItemToCache(Object sender, EventArgs e) 
{ 
    itemRemoved = false; 
    onRemove = new CacheItemRemovedCallback(this.RemovedCallback); 
    if (Cache["Key1"] == null) 
        Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60),TimeSpan.Zero, CacheItemPriority.High, onRemove); 
} 


public void RemoveItemFromCache(Object sender, EventArgs e) 
{ 
    if(Cache["Key1"] != null) 
        Cache.Remove("Key1"); 
} 

理解会话

会话定义为 Web 应用程序和用户之间共享的一段时间。每个使用 Web 应用程序的用户都有自己的会话。可以将项目/对象放入会话中,这些对象将仅为该用户定义。会话包含有助于识别相关值的关键变量。这可以被视为一个哈希表。每个用户将代表哈希中一个不同的键节点,用于标识唯一值。会话变量将由可以清除它的应用程序清除,也可以通过 Web 配置中的超时属性清除。通常,默认超时为 20 分钟。

一个实际的例子是用户登录的 Web 应用程序。每个登录到您的系统的用户都将拥有一个唯一的会话。我们可以将会话中保存的额外数据用于用户浏览您的网站。我们可以通过简单地将其添加到会话中来保存名字、姓氏和其他数据

Session[“FirstName”] = “User First Name”; 
Session[“LastName”] = “User Last Name”; 

//We can clear the session variable by doing the following: 
Session[“FirstName”] = null; 

//We can clear all Session variables by dong the following: 
Session.Abandon(); 
会话变量应针对单个用户使用。它将信息存储在服务器端,不应滥用。缓存和会话之间的区别在于,缓存可在全局/应用程序级别访问,其中对内存的一个引用会更新。每个请求将为不同的用户使用相同的缓存。会话变量将为每个不同的用户使用不同的会话变量。通常,大量数据可以存储在会话中,但是,流量大的网站通常不会使用此方法,因为它会对服务器内存造成严重负载。

理解视图状态

视图状态是 ASP.NET 页面保留的隐藏数据。它们跟踪回发期间网站的更改。所有服务器控件都包含视图状态。控件将具有 EnableViewState 属性,该属性允许您启用/禁用控件属性(例如 Text、value 等)是否将保存在隐藏字段中。

如果您查看运行页面的源代码(右键单击 -> 查看源代码),可以看到页面的视图状态。它将列在以下标签下

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=””></input>

过大的视图状态会导致页面从用户端下载缓慢。当用户单击按钮并发生回发时,所有视图状态信息都必须回发到服务器,这会导致请求变慢。大多数情况下,这并不重要,但想象一下一个使用拨号连接的人。如果请求和页面加载需要几分钟,用户很可能会感到沮丧并离开。

视图状态应限制在所需范围内。大多数情况下,标签不需要启用视图状态,因为它不会改变。甚至可以直接使用 HTML 中的 <span></span> 标签写入,从而减少回发之间发送的字节数。

数据也可以写入 ViewState。ViewState 只在页面的生命周期内持续存在。如果页面重定向到另一个页面,甚至重定向到自身,ViewState 将被重置。ViewState 应该用于保存少量数据,这些数据只在当前页面上使用。下面是如何使用 ViewState 的示例

将数据放入 ViewState

ViewState[“PreviousPage”] = “http://www.google.com”; 

从 ViewState 中检索数据

string PreviousPage = ViewState[“PreviousPage”].ToString(); 

注意:最好先检查对象是否为空。上述方法可以重写为以下形式

If (ViewState[“PreviousPage”] != null ) 
    string PreviousPage = ViewState[“PreviousPage”].ToString(); 

如果您觉得我遗漏了什么,或者陈述了不正确的内容,请给我留言。我将非常感激。任何建议都将不胜感激。

本文最初发表于 http://www.progtalk.com/ViewArticle.aspx?ArticleID=62

© . All rights reserved.