ASP.NET Application,Session,Cookie和ViewState等對象用法和區別

ASP.NET Application,Session,Cookie和ViewState等對象用法和區別

在ASP.NET中,有很多種保存信息的內置對象,如:Application,Session,Cookie,ViewState和Cache等。下面分別介紹它們的用法和區別。

?

方法

?

信息量大小???

?

作用域和保存時間

?

應用范圍

?

保存位置

Application

?

任意大小

?

整個應用程序的生命期

?

整個應用程序/所有用戶

?

服務器端

?

Cache

?

任意大小

?

可以根據需要設定

?

整個應用程序/所有用戶

?

服務器端

?

Session

?

小量,簡單的數據

?

用戶活動時間+一段延遲時間(一般為20分鐘)

?

單個用戶

?

服務器端

?

Cookie

?

小量,簡單的數據

?

可以根據需要設定

?

單個用戶

?

客戶端

?

Viewstate

?

小量,簡單的數據

?

一個Web頁面的生命期

?

單個用戶

?

客戶端

?

隱藏域

?

小量,簡單的數據

?

一個Web頁面的生命期

?

單個用戶

?

客戶端

?

查詢字符串

?

小量,簡單的數據

?

直到下次頁面跳轉請求

?

單個用戶

?

客戶端

1.Application對象

Application用于保存所有用戶的公共的數據信息,如果使用Application對象,一個需要考慮的問題是任何寫操作都要在Application_OnStart事件(global.asax)中完成.盡管使用Application.Lock和Applicaiton.Unlock方法來避免寫操作的同步,但是它串行化了對Application對象的請求,當網站訪問量大的時候會產生嚴重的性能瓶頸.因此最好不要用此對象保存大的數據集合. 下面我們做個在線用戶統計的例子來說明這個問題:

(以文件的形式存放網站總訪問量)

Global.asax類

using System;

using System.Collections;

using System.ComponentModel;

using System.Web;

using System.Web.SessionState;

using System.IO;

/// Global 的摘要說明。

public

class Global : System.Web.HttpApplication

{

///

必需的設計器變量。

private System.ComponentModel.IContainer components = null;

private FileStream fileStream;

private StreamReader reader;//讀字符流

private StreamWriter writer;//寫字符流

public Global()

{

InitializeComponent();

}

protected

void Application_Start(Object sender, EventArgs e)

{

Application["CurrentGuests"]=0;//初始花為0;

fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//文件不存在,創建文件

reader = new StreamReader(fileStream);//要讀取的完整路徑

Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //從當前流中讀取一行字符并將數據作為字符串返回

reader.Close();//關閉流

}

protected

void Session_Start(Object sender, EventArgs e)//當用戶訪問網站時,在線用戶+1,總訪問數+1

{

Application.Lock();//同步,避免同時寫入

Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//總在線用戶數

Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//訪問網站的總用戶數

fileStream = new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);//

writer = new StreamWriter(fileStream);//實現一個寫入流,使其以一種特定的編碼向流中寫入字符

writer.WriteLine(Application["AllGuests"].ToString());//把訪問網站的總用戶數再次寫入到文件

writer.Close();//關閉寫入流

Application.UnLock();//同步結束

}

protected

void Session_End(Object sender, EventArgs e)//當前用戶退出網站時,在線用戶數量-1,

{

Application.Lock();

Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//總在線用戶數量-1

Application.UnLock();

}

(2) WebForm1.aspx

private

void Page_Load(object sender, System.EventArgs e)

{

this.Label1.Text = "正在訪問站點的用戶數:" + Application["CurrentGuests"].ToString();

this.Label2.Text ="訪問過站點的總用戶數:" + Application["AllGuests"].ToString();

}

2.Session對象

Session用于保存每個用戶的專用信息.每個客戶端用戶訪問時,服務器都為每個用戶分配一個唯一的會話ID(Session ID) . 她的生存期是用戶持續請求時間再加上一段時間(一般是20分鐘左右).Session中的信息保存在Web服務器內容中,保存的數據量可大可小.當Session超時或被關閉時將自動釋放保存的數據信息.由于用戶停止使用應用程序后它仍然在內存中保持一段時間,因此使用Session對象使保存用戶數據的方法效率很低.對于小量的數據,使用Session對象保存還是一個不錯的選擇.使用Session對象保存信息的代碼如下:

//存放信息

Session["key"]="value"

//讀取數據

string UserName=Session["key"].ToString();

3.Cookie對象

Cookie用于保存客戶瀏覽器請求服務器頁面的請求信息,程序員也可以用它存放非敏感性的用戶信息,信息保存的時間可以根據需要設置.如果沒有設置Cookie失效日期,它們僅保存到關閉瀏覽器程序為止.如果將Cookie對象的Expires屬性設置為Minvalue,則表示Cookie永遠不會過期.Cookie存儲的數據量很受限制,大多數瀏覽器支持最大容量為4K,因此不要用來保存數據集及其他大量數據.由于并非所有的瀏覽器都支持Cookie,并且數據信息是以明文文本的形式保存在客戶端的計算機中,因此最好不要保存敏感的,未加密的數據,否則會影響網站的安全性.使用Cookie對象保存的代碼如下:

//存放信息

Response.Cookies["key"].Value="value";

//讀取信息

string UserID=Response.Cookies["key"].Value;

4.ViewState對象

ViewState 常用于保存單個用戶的狀態信息,有效期等于頁面的生存期。跟隱藏控件相似。viewstate是在本頁面之內各函數間進行傳值的 , 至于為什么要使用這種方法是因為在一個事件發生之后 , 頁面可能會刷新 , 如果定義全局變量會被清零 , 所以要使用 viewstate. ViewState容器可以保持大量的數據,但是必須謹慎使用,因為過多使用會影響應用程序的性能。所有Web服務器控件都使用ViewState在頁面回發期音保存自己的狀態信息。如果某個控件不需要在回發期間保存狀態信息,最好關閉該對象的ViewState,避免不必要的資源浪費。通過給@Page指令添加“EnableViewState=false”屬性可以禁止整個頁面的ViewState。使用ViewState對象保存信息的代碼如下。

//存放信息

ViewState["key"]="value";

//讀取信息

string NameID=ViewState["nameID"].ToString();

5.Cache對象

Cache對象用于在HTTP請求間保存頁面或數據。該對象的使用可以極大地提高整個應用程序的效率。常用于將頻繁訪問的大量服務器資源存儲在內存中,當用戶發出相同的請求后服務器不再次處理而是將Cache中保存的信息返回給用戶,節省了服務器處理請求的時間。其生存期依賴于該應用程序的生存期。當重新啟動應用程序時,將重新創建其Cache對象的實例。使用Cache對象保存信息的代碼如下。

//存放信息

Cache["nameID"]="0001";

//存放信息

Cache.Insert("nameID","0001"1);

//讀取信息

string NameID=Cache["nameID"].ToString();

6.隱藏域

Hidden控件是屬于HTML類型的服務器控件,使用此控件可以實現隱藏域的功能。其實此控件和其它服務器控件的使用沒有太大區別,只是它不會在用戶端的瀏覽器中顯示,始終處于隱藏狀態。但是每次頁面提交的時候,此控件和其它服務器控件一同提交到服務器端,因此在服務器端可以使用Value屬性獲取或保存一些數據信息。使用Hidden控件保存信息的代碼如下。

//存放信息

Hidden.Value="0001";

//獲取信息

string NameID=Hidden.Value;

7.查詢字符串

查詢字符串的方式是將要傳遞的值連接在URL后面,然后通過Response.Redirect方法實現客戶端的重定向。這種方式可以實現在兩個頁面之間傳遞信息。由于URL的長度有一定的限制,因此不能傳遞太大的信息,加外安全性也不是很好。

傳遞信息如下。

問號后面格式 key1=value1&key2=value2

Response.Redirect("List.aspx?nameID=0001&gradeID=002");

//執行上面的語句后在IE地址欄顯示的URL的代碼如下。

http://localhost/List.aspx?nameID=0001&grade=002

//當跳轉到List.aspx后,可以通過以下代碼獲得所傳遞的信息。

string NameID.GradeID;

NameID=Request.Params["nameID"];

GradeID=Request.Params["gradeID"];

轉載于:https://www.cnblogs.com/kevinwang/archive/2008/05/28/1209170.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/380022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/380022.shtml
英文地址,請注明出處:http://en.pswp.cn/news/380022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java——集合(HashMap與Hashtable的區別)

* HashMap和Hashtable的區別* 共同點:* 底層都是哈希算法,都是雙列集合* 區別:* 1,HashMap是線程不安全的,效率高* Hashtable是線程安全的,效率低 * 2,HashMap可以存儲null鍵和null值* Has…

判斷字符串是否構成回文_構成字符串回文的最小刪除數

判斷字符串是否構成回文Problem statement: 問題陳述: Given string str find the minimum number of deletions such that the resultant string is a palindrome. 給定的字符串str找到最小的刪除數,以使最終的字符串成為回文。 Input:Each input con…

imul和idiv指令

imul 有符號乘法指令,分單操作數,雙操作數和但操作數 單操作數:此形式與mul指令使用完全相同,操作數乘以al、ax、或eax寄存器中的值,乘積分別存儲到ax、dx:ax或edx:eax中 執行指令&#xff1a…

Ajax的注冊應用

最近發現Ajax在用戶注冊表單和用戶登錄表單方面應用,最能體現Ajax的交互特點,因此又是寫了一個習作! 演示效果 新開窗口地址: http://www.klstudio.com/demo/ajax/reg.htm 下載地址:http://www.klstudio.com/demo/ajax/reg.rar &…

Java——集合(模擬斗地主洗牌和發牌進行排序)

//改進版,沒有進行按牌的地位從小到大排序 package com.yy.test;import java.util.ArrayList; import java.util.Collections;public class Test2 {/*** * A:案例演示* 模擬斗地主洗牌核發牌,牌沒有排序* * 分析:* 1,…

應用程序控件

活動指示器 當任務或進程已經完成時,活動指示器就會消失。推薦您使用這種默認行為,因為用戶期望在有動作發生時看到活動指示器,而且他們會將靜止不動的活動指示器與停滯的進程聯想到一起。 要了解如何顯示網絡活動指示器,請參考UI…

離散數學與集合論_離散數學中的集合論和集合類型

離散數學與集合論集合論 (Set theory) The set is a well-defined collection of definite objects of perception or thought and the Georg Cantor is the father of set theory. A set may also be thought of as grouping together of single objects into a whole. The ob…

XADD和NEG命令

XADD 交換相加指令,先交換然后相加 比如說: xadd eax,ecx /* 相當于:先執行:xchg eax,ecx然后執行:add eax,ecx */此時eax2,ecx3,執行完:eax5,ecx2 neg …

Visual C# 2008+SQL Server 2005 數據庫與網絡開發--11.3.2 LINQ to SQL對數據庫建模

Visual Studio 2008版本中為LINQ to SQL提供了一個特別的設計器,使用這個設計器可以很方便的將數據庫可視化地轉換為LINQ to SQL對象模型。在LINQ to SQL中,設計器在關系數據庫的數據模型和開發語言之間建立一座橋梁。當應用程序運行時,LINQ …

Java——異常處理(鍵盤錄入一個整數,輸出其對于二進制)

例題: 鍵盤錄入一個int類型的整數,對其求二進制表現形式 如果錄入的整數過大,給予提示,錄入的整數過大,請重新錄入一個整數BigInteger 如果錄入的是小數,給予提示,錄入的是小數,請…

認清SQL_Server_2005的基于行版本控制的兩種隔離級別

--認清SQL_Server_2005的基于行版本控制的兩種隔離級別--By:zc_0101 Date:2010-03-31--快照隔離級別(snapshot)和已提交讀快照隔離級別(read committed snapshot)--特點:在這兩種隔離級別下,讀取數據時不再請求共享鎖,而且永遠不會與修改進程…

Java SecurityManager checkPermission()方法與示例

Syntax: 句法: public void checkPermission(Permission perm);public void checkPermission(Permission perm, Object cntxt);SecurityManager類的checkPermission()方法 (SecurityManager Class checkPermission() method) checkPermission() method is availa…

匯編test指令

功能:將兩個操作數進行邏輯與運算,并根據運算結果設置相關的標志位,并不改變操作數1和操作數2的值 test 操作數1,操作數2我們經常用test來判斷一個值是否為0,用法: test 操作數1,操作數1比如我…

CSS兼容IE/Firefox要點

首先我們說說firefox和IE對CSS的寬度顯示有什么不同: 其實CSS ’width’ 指的是標準CSS中所指的width的寬度,在firefox中的寬度就是這個寬度。它只包含容器中內容的寬度。而Internet Explorer ’width’則是指整個容器的寬度,包括內容&#x…

Java GregorianCalendar computeFields()方法與示例

GregorianCalendar類computeFields()方法 (GregorianCalendar Class computeFields() method) computeFields() method is available in java.util package. 在java.util包中提供了validateFields()方法 。 computeFields() method is used to compute the calendar fields and…

JS、JNS、JP(JPE)、JNP(JPO)指令詳解、從原理上解釋

JS 格式: js 地址當執行到JS指令時,如果標志位SF1,則跳轉到指定的地址,如果SF0,不跳轉 比如: cmp eax,ecx js 0040100c此時eax0,ecx1,執行完cmp命令,符號標…

zz如何保持專心

養成好習慣 養成在固定時間、固定地點專心學習工作的好習慣。 如果可能,在進入學習或者工作狀態前做一些小儀式,比如擺個姿勢,戴上學習帽什么的。就好像在運動前做準備活動一樣,給身體一個提示。讓頭腦做好準備 避免在學習前做什么…

Java——File類

一,File類的概述和構造方法 A:file類的概述 file類可以理解成一個路徑 文件夾或者是文件夾路徑 路徑分為絕對路徑和相對路徑 絕對路徑是一個固定的路徑,從盤符開始 這里的G:\TIM 就是一個絕對路徑,是一個固定的路…

Linux進程環境

一 main函數 當內核使用一個exec函數執行C程序時,在調用main函數之前先調用一個特殊的啟動例程,可執行程序將此例程指定為程序的起始地址。啟動例程從內核獲取命令行參數和環境變量,然后為調用main函數做好準備。 二 進程終止 進程終止的方式…

JO、JNO、JB、JNB命令詳解(從原理上)

JO 當執行到jo命令時,如果ZF標志位為1,則跳轉,反之不跳轉 add eax,ecx jo 00401000c此時eax7fff ffff ,ecx0000 0001,執行完add命令,OF1,原因是eax存儲的最大值是7fffffff,再加1&a…