中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

          Java專題文章博客和開源

          常用鏈接

          統(tǒng)計

          最新評論

          ASP.NET中的新狀態(tài)容器

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

            Cache

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

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

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

          // 給緩存添加項
          Cache["myKey"] = myValue;

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

          // 把CacheDuration增加10秒并把項添加到緩存中
          Cache.Insert("myKey",myValue, null, System.DateTime.Now.AddSeconds(10),
          System.Web.Caching.Cache.NoSlidingExpiration);
           
            Cache對象的最強大的特性之一是當(dāng)緩存中的某個項終止時執(zhí)行回調(diào)的能力。它使用了委托或函數(shù)指針,這在本文中沒有討論。幸運的是一旦你有了某些這些技術(shù)怎樣工作的示例,就能通過簡單的剪切和粘貼在應(yīng)用程序中使用它們,不需要知道委托是怎樣工作的復(fù)雜過程。有很多使用這種功能的原因,最通常的是在數(shù)據(jù)終止時用當(dāng)前數(shù)據(jù)重新填充緩存,或者如果重新填充緩存的數(shù)據(jù)源不可用時恢復(fù)舊的緩存數(shù)據(jù)雅思代考_答案_改分

            在我的例子中,簡單地緩存了當(dāng)前時間,當(dāng)緩存超期的時候,我將給緩存中的字符串末尾添加一個星號(*)。在超過時間后,你能通過計算星號的數(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)
           {
            // 因為數(shù)據(jù)在緩存中,所有讀取數(shù)據(jù)
            data = System.DateTime.Now.ToString();

            //建立回調(diào)委托的一個實例
            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)委托的一個實例
           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)示例

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

            Context

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

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

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

          // 給Context添加項
          Context.Items["myKey"] = myValue;

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

            ViewState

            ViewState為單個用戶保持狀態(tài)信息,保持期為ASPX頁面工作時間。ViewState容器可以保持大量的數(shù)據(jù),但是必須小心管理ViewState的大小,因為它增加了每個請求和回應(yīng)的下載(download)大小。

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

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

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

          // 給ViewState添加項
          ViewState["myKey"] = myValue;

          //從Context讀取項
          Response.Write(ViewState["myKey"]);
           
            當(dāng)建立自定義Web控件時,你也許希望它們有ViewState的好處。這在控件的屬性層可以簡單實現(xiàn)。代碼段6演示了怎樣保存一個簡單的自定義控件的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);
            }
           }
          }

          posted on 2013-02-28 15:59 好不容易 閱讀(408) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 荣昌县| 贵定县| 突泉县| 华安县| 扶沟县| 涪陵区| 黑水县| 朝阳县| 深圳市| 青龙| 新昌县| 临清市| 景谷| 井冈山市| 胶南市| 商河县| 上犹县| 台前县| 丰都县| 武平县| 宁波市| 正宁县| 龙里县| 南昌市| 兰州市| 建宁县| 梁河县| 沂南县| 关岭| 南昌市| 彝良县| 新闻| 营山县| 巩留县| 遂溪县| 泽普县| 长阳| 称多县| 永年县| 呼玛县| 桐庐县|