国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
ASP.NET保持用戶狀態(tài)的九種選擇(下)
ASP.NET中的新狀態(tài)容器

  前面我們提到,ASP.NET為保存用戶請(qǐng)求間的數(shù)據(jù)添加了幾種新的途徑。這些途徑給了你如何保持狀態(tài)信息更好的控制。這些技術(shù)的范圍可以窄到只有一個(gè)請(qǐng)求那么?。–ontext對(duì)象),也可以寬到整個(gè)Web服務(wù)器和服務(wù)器上的所有應(yīng)用程序(Machine.config文件)。在多數(shù)情況下你有多種保存特定數(shù)據(jù)片的選擇--使用每個(gè)方法描述的問題和答案來決定某個(gè)對(duì)象是否適合你的需要。

  Cache

  Cache對(duì)象用于單個(gè)用戶、一組用戶或所有的用戶。這種數(shù)據(jù)為多個(gè)請(qǐng)求保持。它可以保持很長(zhǎng)時(shí)間,但是不能超過應(yīng)用程序重新啟動(dòng)的時(shí)間,并且數(shù)據(jù)的終止基于時(shí)間或者其它的依賴關(guān)系。它可以高效率地保持大量或少量地?cái)?shù)據(jù)。

  Cache 是ASP.NET中最"酷"的對(duì)象之一。它提供了難以置信的靈活性、通用性和性能,因此在ASP.NET應(yīng)用程序中它通常是比Application或Sessions更好的保持?jǐn)?shù)據(jù)的對(duì)象。本文沒有詳細(xì)介紹Cache對(duì)象的使用方法,但是仍然可以說它是一個(gè)萬能對(duì)象。與其它的集合對(duì)象相似,它是一個(gè)簡(jiǎn)單的名稱-值集合,但是通過使用指定特定用戶的鍵值可以緩存特定用戶的值。同樣你可以緩存不同的相關(guān)數(shù)據(jù)的多個(gè)數(shù)據(jù)集,例如幾個(gè)有鍵(如fordcars 、 chevycars、gmcars)的汽車集合。Cache中的數(shù)據(jù)可以給定一個(gè)絕對(duì)的、可變的或基于文件的終止時(shí)間。它們也實(shí)現(xiàn)了一個(gè)回調(diào)功能,在被緩存的值從緩存中提取時(shí)被調(diào)用,這個(gè)功能很有用,因?yàn)榻又隳軝z查它是否為最新的數(shù)據(jù)變量,如果不是(或數(shù)據(jù)源不可用),就重新緩存被終止的值。

  添加和訪問緩存中值的語法與先前談到的相似。但是Cache給訪問集合內(nèi)容的標(biāo)準(zhǔn)索引器方法作了補(bǔ)充,它支持多種方法,允許對(duì)被緩存數(shù)據(jù)的更多的控制。最頻繁使用的方法是Insert,它支持幾種重載,允許你指定依賴、超時(shí)值、優(yōu)先級(jí)和回調(diào)。下面是一些簡(jiǎn)單的例子:


// 給緩存添加項(xiàng)
Cache["myKey"] = myValue;

// 從緩存中讀取項(xiàng)
Response.Write(Cache["myKey"]);

// 把CacheDuration增加10秒并把項(xiàng)添加到緩存中
Cache.Insert("myKey",myValue, null, System.DateTime.Now.AddSeconds(10),
System.Web.Caching.Cache.NoSlidingExpiration);
 

  Cache對(duì)象的最強(qiáng)大的特性之一是當(dāng)緩存中的某個(gè)項(xiàng)終止時(shí)執(zhí)行回調(diào)的能力。它使用了委托或函數(shù)指針,這在本文中沒有討論。幸運(yùn)的是一旦你有了某些這些技術(shù)怎樣工作的示例,就能通過簡(jiǎn)單的剪切和粘貼在應(yīng)用程序中使用它們,不需要知道委托是怎樣工作的復(fù)雜過程。有很多使用這種功能的原因,最通常的是在數(shù)據(jù)終止時(shí)用當(dāng)前數(shù)據(jù)重新填充緩存,或者如果重新填充緩存的數(shù)據(jù)源不可用時(shí)恢復(fù)舊的緩存數(shù)據(jù)。

  在我的例子中,簡(jiǎn)單地緩存了當(dāng)前時(shí)間,當(dāng)緩存超期的時(shí)候,我將給緩存中的字符串末尾添加一個(gè)星號(hào)(*)。在超過時(shí)間后,你能通過計(jì)算星號(hào)的數(shù)量來確定緩存超期了多少次。圖9演示了回調(diào)的重要概念,并且提供了給使用緩存建立更多功能回調(diào)程序的好模板。


private void Page_Load(object sender, System.EventArgs e)
{
 string cacheKey = "myKey";
 string data = "";
 // 檢查數(shù)據(jù)是否已經(jīng)被緩存了
 if(Cache[cacheKey]==null)
 {
  // 因?yàn)閿?shù)據(jù)在緩存中,所有讀取數(shù)據(jù)
  data = System.DateTime.Now.ToString();

  //建立回調(diào)委托的一個(gè)實(shí)例
  CacheItemRemovedCallback callBack =new CacheItemRemovedCallback(onRemove);

  Label1.Text = "Generated: " + data;

  Cache.Insert(cacheKey,data,null,
      System.DateTime.Now.AddSeconds(5),
      System.Web.Caching.Cache.NoSlidingExpiration,
      System.Web.Caching.CacheItemPriority.Default,
      callBack);
 }
 else
 {
  Label1.Text = "Cached: " + Cache[cacheKey].ToString();
 }
}

private void onRemove(string key, object val,CacheItemRemovedReason reason)
{
 //建立回調(diào)委托的一個(gè)實(shí)例
 CacheItemRemovedCallback callBack =new CacheItemRemovedCallback(onRemove);
    Cache.Insert(key,val.ToString() +
    "*",null,System.DateTime.Now.AddSeconds(5),Cache.NoSlidingExpiration,
    System.Web.Caching.CacheItemPriority.Default, callBack);
}
 

代碼段5.緩存回調(diào)示例

  注意代碼段中一個(gè)重要的特性是在Page_Load中使用模式(pattern)來確定是否使用緩存中的數(shù)據(jù)。當(dāng)你處理緩存中的項(xiàng)時(shí)也可能使用這種模式。使用if語句來檢查緩存的當(dāng)前內(nèi)容是否為空(因?yàn)橐啻我?,為緩存鍵使用了一個(gè)變量)。如果是空的,從數(shù)據(jù)源生成數(shù)據(jù)并放入緩存中。如果不是空的,從緩存中返回?cái)?shù)據(jù)。如果數(shù)據(jù)訪問邏輯很復(fù)雜,你需要把整個(gè)if語句放入一個(gè)獨(dú)立的函數(shù),該函數(shù)的任務(wù)是檢索數(shù)據(jù)。
Cache對(duì)象的功能比先前我們討論的大多數(shù)對(duì)象多得多。這也是ASP.NET更強(qiáng)大的功能之一,并且我明確地推薦閱讀關(guān)于它的更多內(nèi)容。

  Context

  Context對(duì)象保持單個(gè)用戶、單個(gè)請(qǐng)求的數(shù)據(jù),并且數(shù)據(jù)只在該請(qǐng)求期間保持。Context容器可以保持大量的數(shù)據(jù),但是典型的情況下是保存小的數(shù)據(jù)片,因?yàn)樗?jīng)常通過global.asax中的某個(gè)處理方法為每個(gè)請(qǐng)求實(shí)現(xiàn)。

  Context容器(從Page對(duì)象訪問或使用System.Web.HttpContext.Current)被提供用于保持需要在不同的HttpModules和HttpHandlers之間傳遞的值。它也可以用于保持某個(gè)完整請(qǐng)求的相應(yīng)信息。例如,IbuySpy入口在global.asax中的Application_BeginRequest事件過程中給容器填滿了許多配置信息。注意這只在當(dāng)前請(qǐng)求中可用,如果你希望在下一個(gè)請(qǐng)求中也能使用,請(qǐng)考慮使用ViewState。

  從Context集合中設(shè)置和獲取數(shù)據(jù)使用的語法與前面討論的其它集合對(duì)象(如Application、Sessions和 Cache)的相似。下面是兩個(gè)簡(jiǎn)單的例子:


// 給Context添加項(xiàng)
Context.Items["myKey"] = myValue;

// 從Context中讀取項(xiàng)
Response.Write(Context["myKey"]);

 

  ViewState

  ViewState為單個(gè)用戶保持狀態(tài)信息,保持期為ASPX頁面工作時(shí)間。ViewState容器可以保持大量的數(shù)據(jù),但是必須小心管理ViewState的大小,因?yàn)樗黾恿嗣總€(gè)請(qǐng)求和回應(yīng)的下載(download)大小。

  ViewState是ASP.NET中的一個(gè)新容器,也許你已經(jīng)使用它了,但是你可能還是不了解它。這是因?yàn)樗械膬?nèi)建Web控件都使用ViewState在頁面回發(fā)(postback)間保持自己的值。但是你必須小心,因?yàn)樗绊憫?yīng)用程序的性能。影響的大小依賴于回發(fā)之間使用ViewState的多少--對(duì)大多數(shù)Web窗體來說數(shù)量非常小。

  確定某個(gè)頁面上每個(gè)控件使用的ViewState的數(shù)量最簡(jiǎn)單的方法是打開頁面追蹤并檢查每個(gè)控件負(fù)載了多少個(gè)ViewState。如果某個(gè)特定控件不需要在回發(fā)之間保持?jǐn)?shù)據(jù),請(qǐng)通過把EnableViewState設(shè)置為false關(guān)閉該對(duì)象的ViewState。你也可以通過在瀏覽器中查看的HTML源并檢查隱藏窗體字段__VIEWSTATE來確定某個(gè)給定的ASP.NET頁面ViewState的總共大小。注意這些內(nèi)容都是使用Base64編碼的,用于放置偶然的查看和維護(hù)。ViewState也可以通過給@Page指令添加EnableViewState="false"在整個(gè)頁面中禁止。

  典型的Web窗體不需要直接維護(hù)ViewState。但是如果你建立自定義Web控件,就需要了解它是怎樣工作的,并為你的控件實(shí)現(xiàn)它,這樣該控件的工作方式才能與隨ASP.NET發(fā)布的Web控件同樣地工作。向ViewState讀取或?qū)懭胫刀伎梢酝ㄟ^上面討論地其它集合對(duì)象的語法完成:


// 給ViewState添加項(xiàng)
ViewState["myKey"] = myValue;

//從Context讀取項(xiàng)
Response.Write(ViewState["myKey"]);
 

  當(dāng)建立自定義Web控件時(shí),你也許希望它們有ViewState的好處。這在控件的屬性層可以簡(jiǎn)單實(shí)現(xiàn)。代碼段6演示了怎樣保存一個(gè)簡(jiǎn)單的自定義控件的PersonName屬性到ViewState中,并在該控件的Render方法中使用它。


namespace MSDN.StateManagement
{
 public class HelloPerson : System.Web.UI.Control
 {
  public string PersonName
  {
   get
   {
    string s = (string)ViewState["PersonName"];
    return ((s == null) ? "" : s);
   }
   set
   {
    ViewState["PersonName"] = value;
   }
  }
  protected override void Render(System.Web.UI.HtmlTextWriter writer)
  {
   writer.Write("Hello " + PersonName);
  }
 }
}

代碼段6.在ViewState中保存數(shù)據(jù)

  Web.config和Machine.config文件

  這些文件中的數(shù)據(jù)對(duì)于某個(gè)應(yīng)用程序的所有用戶來說都可以使用。Web.config文件中存儲(chǔ)的數(shù)據(jù)可用于應(yīng)用程序的整個(gè)生命周期。這些數(shù)據(jù)一般很小,該對(duì)象一般用于保持文件位置和數(shù)據(jù)庫連接的字符串。大的數(shù)據(jù)片最好保存在其它位置。

  作為其它多樣集合對(duì)象的補(bǔ)充,ASP.NET引入了一組XML配置文件用于管理應(yīng)用程序甚至于整個(gè)服務(wù)器的很多設(shè)置。每個(gè)ASP.NET應(yīng)用程序使用Web.config文件來設(shè)置它的許多屬性,每個(gè)服務(wù)器在系統(tǒng)文件夾下有一個(gè)作為應(yīng)用程序基礎(chǔ)的Machine.config文件。這些設(shè)置都作為默認(rèn)值使用,除非重載。作為保存配置數(shù)據(jù)的補(bǔ)充,這些文件可以保存應(yīng)用程序(或多個(gè)應(yīng)用程序)需要的數(shù)據(jù)。

  無論什么時(shí)候應(yīng)用程序啟動(dòng)都會(huì)讀取配置信息,接著這些信息被緩沖。由于被緩沖了,應(yīng)用程序可以快速讀取它們,因此不需要考慮應(yīng)用程序的瓶頸,因?yàn)樗?jīng)常執(zhí)行某個(gè)文本文件的一些整型信息。此外,某個(gè)應(yīng)用程序的Web.config的改變將導(dǎo)致應(yīng)用程序重新啟動(dòng)。這確保了對(duì)配置文件信息的修改立即反映到應(yīng)用程序中。

  數(shù)據(jù)庫連接信息,默認(rèn)圖像路徑和XML數(shù)據(jù)文件路徑是通常保存在Web.config文件中的數(shù)據(jù)片。在Web.config文件中保存數(shù)據(jù)的語法如下,在理想的情況下你也許希望使用集成的SQL身分驗(yàn)證:


<configuration>
<!-應(yīng)用程序特殊設(shè)置 -->
<appSettings>
<add key="connectionString" value="server=myDBServer;
uid=myUID;pwd=myPassword;database=myDB" />
</appSettings>
<system.web>
<!-所有的wsb設(shè)置 -->
</system.web>
</configuration> 

  為了訪問ASP.NET頁面中的值,可以使用ConfigurationSettings集合,它在System.Configuration名字空間中。下面的簡(jiǎn)單例子演示了怎樣提取前面的連接字符串到一個(gè)本地變量中:

using System.Configuration;
ooo
String strConnString =
ConfigurationSettings.AppSettings["connectionString"];

  給System.Configuration名字空間添加一個(gè)引用減少了引用這些值的代碼數(shù)量。因?yàn)閷?duì)Web.config或 Machine.config的修改將導(dǎo)致應(yīng)用程序立即重新啟動(dòng),典型情況下這些值只由服務(wù)器系統(tǒng)管理員手動(dòng)修改。因此你可以認(rèn)為這些文件是保存只讀數(shù)據(jù)而不是應(yīng)用程序中修改的數(shù)據(jù)的好位置。

  結(jié)論

  有效的狀態(tài)管理意味著識(shí)別的用戶經(jīng)驗(yàn)、數(shù)據(jù)錯(cuò)誤與快速的頁面或事務(wù)處理之間的巨大差別。盡管狀態(tài)管理在ASP 3.0中不太適用,但是ASP.NET把它帶到了本文討論的狀態(tài)對(duì)象的控制之下。小心地使用它們將使你給用戶展示最佳的Web經(jīng)驗(yàn)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
在.net中常用的幾種頁面間傳遞參數(shù)的方法
Application、Cookie、Session和Cache
緩存技術(shù)
介紹緩存的基本概念和常用的緩存技術(shù)
ASP.NET Application,Session,Cookie和ViewState等對(duì)象用法和區(qū)別
.net代碼優(yōu)化
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服