Asp.net 服務器Application,Session,Cookie,ViewState和Cache區別

2.8 Context 的使用
Context 對象包含與當前頁面相關的信息,提供對整個上
下文的訪問,包括請求、響應、以及上文中的Session 和
Application 等信息。可使用此對象在網頁之間共享信息,
從而實現頁面間的傳值。
與使用 Form 的方法相似,該方法也能保持大量的數據,
缺點也相同,但使用方法相對比較簡單。示例以下:
Src.aspx:
Context.Items["id"]=TextBox1.Text;
Server.Transfer("Dst.aspx");
Dst.aspx:
Label1.Text=Context.Items["id"].ToString();
Context.Items.Remove("id"); //移除項html

傳值方法生命週期應用範圍數據類型數據大小
使用QueryString 與目標頁有關單用戶 字符串 1KB
使用Form 當前請求單用戶 所有 不限
使用 Session 當前會話單用戶 所有 不限
使用 Application 應用程序全局 所有 不限
使用 Cookie 可自定義單用戶 字符串 4KB
使用Static 變量應用程序全局 所有 不限
使用 Cache 可自定義全局 所有 不限
使用 Context 當前請求單用戶 所有 不限
使用 ViewState 當前頁單用戶 所有 不限
使用 Web.config 和
Machine.config
可永久全局 字符串 不限
使用數據庫或文件永久 全局 所有 不限程序員

傳遞無需保密
的簡單數據使用QueryString 最方便;經過控件直接傳遞數據
只能使用Form;傳遞只與具體用戶有關的數據使用Session
最合適;要想在全部的用戶間共享數據使用Application 比較
方便,而共享數據若是是字符串常量則使用Web.config 也是
很好的選擇;Static 變量能夠長時間保持數據,而Cache 會自
動清除數據,Context 還具備訪問請求、會話以及Application
的能力;若是要長期保存數據,則只能在Cookie、Web.config、
數據庫或文件之中選擇;除使用數據庫或文件以外,數據傳
遞速度都很快,數據庫

系統對象與狀態管理   
原文   http://www.cnblogs.com/liaoqiang/archive/2010/01/30/1660021.html

Page對象
Page
對象是指向頁面自身的方式,在整個頁面的執行期內,均可以使用該對象
示例:數組

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="defautl.aspx.cs" Inherits="_default"%>瀏覽器

屬性安全

說明服務器

Language框架

指定頁面代碼和後置代碼使用的語言,須要注意的是,這裏支持微軟.NET框架中的語言jsp

AutoEventWireup函數

設置頁面是否自動調用網頁事件(也就是在後置代碼中的Page_Load() 事件是否執行),默認(不寫時)爲true

CodeFile

指定代碼後置文件,後置代碼,該後置代碼與頁面是局部關係

Inherits

頁面類

Request對象
Request
對象封裝了由Web瀏覽器或其餘客戶端生成的 HTTP 請求的細節(參數、屬性和數據),提供從瀏覽器讀取信息或這讀取客戶端信息等功能,用於頁面請求期
Request
對象是HttpRequest類的一個實例。它可以讀取客戶端在Web請求期間發送的HTTP值。

Request對象屬性

屬性

說明

屬性

說明

UserLanguages

客戶端主機所使用的語言

Pathq

當前網頁的相對地址

UserHostName

客戶端主機的DNS名稱

IsSecureConnection

目前聯機的安全性

userHostArrress

客戶端主機的IP地址

IsAuthenticated

目前聯機是否有效

UserAgent

客戶端瀏覽器版本

Headers

網頁的標題集合

Url

當前要求的URL

Form

窗體變量

TotalBytes

當前輸入的容量大小

Files

客戶端上傳的文件

ServerVariables

網頁的Server變量,集合中包含了服務器和客戶端的系統信息

Cookies

HttpCookieCollection對象集合

RequestType

客戶端網頁的傳送方式(Get/Post)

HttpMethod

目前客戶端網頁的傳送方式(Get/Post)

RawUrl

當前頁面的URL

FilePath

當前執行網頁的相對地址

QueryString

瀏覽器地址欄後的參數

ContentType

當前需求的MIME內容類型

PhysicalPath

當前網頁在服務器端實際路徑

ContentEncoding

客戶端瀏覽器的字符設置

ClientCertificate

客戶端安全認證信息

Path

獲取當前請求的虛擬路徑

PhysicalApplicationPath

當前在服務器端執行的程序的實際路徑

ConnectionlD

客戶端所提出的網頁瀏覽請求的聯機的ID

AnnlicationPath

當前運行程序的服務器端虛擬目錄

BinaryRead

執行對當前輸入流進行指定字節數的二進制讀取

Params

返回QueryStringFormCookiesServerVariables的所有集合

Browser

客戶端瀏覽器的信息(獲取有關正在請求的客戶端的瀏覽器功能的信息)

 

示例:1、使用QuestString獲取 HTTP 查詢字符串變量集合

頁面1中有一鏈接地址進行參數傳遞: <a href = "QueryString.aspx?nameA='asp'&nameB='jsp'"></a>
  
頁面2得到地址參數:    //首次加載
    protected void Page_Load(object sender, EventArgs e)  {
        if (!IsPostBack)    {
            if(Request.QueryString["nameA"] != null && Request.QueryString["nameB"] != null)     {
                string nameA = Request.QueryString["nameA"] as string ;
                string nameB = Request.QueryString["nameB"] as string ;
            }      }    }
2
、使用Form獲取 HTTP 查詢字符串變量集合
頁面1中有一鏈接地址進行參數傳遞:
    <form name="formGet" method="get" action = "Form.aspx?nameA='asp'&nameB='jsp'">    </form>
頁面2得到地址參數:
    //
首次加載
    <Script Language="C#" Runat="Server">
        void Page_Load(object sender, System.EventArgs e)    {
            Response.Write(Request.Form["nameA"] + "<br>" +Request.QueryString["nameB"]);
        }   </Script>
 Response
對象

Response對象封裝返回到 HTTP 客戶端的輸出,提供向瀏覽器輸出信息或者發送指令,用於頁面執行期

Response對象的經常使用方法

Write(String str)

能夠輸出指定的文本內容

End()

可使用 Web 服務器中止當前的程序並返回結果

Rediect(String URL)

能夠將也頁面重定向到另一個頁面

 

Page對象在後置頁面中的屬性

返回類型

語法

說明

示例

boolean

IsPostBack

獲取一個值,該值指定該頁是否正爲響應客戶端回發而加載,或者他是否正被首次加載或訪問 (true 說明是響應客戶端回發而加載 false 說明是首次加載或訪問)

if (!IsPostBack) {
this.txtName.Text = "
請在此輸入用戶名";
  this.txtPwd.Text = "
請在此輸入密碼";}

boolean

IsCrossPagePostBack

獲取一個值,該值指示跨頁回發中是否涉及該頁(判斷頁面是不是跨頁提交)( true 說明是跨頁提交false 說明不是跨頁提交)

if (Page.IsCrossPagePostBack) {this.txtKeyWord.Text = "跨頁數據傳遞";}

 

PreviousPage 的屬性和方法

返回類型

語法

說明

示例

boolean

IsCrossPagePostBack

獲取一個值,該值指示跨頁回發中是否涉及該頁(判斷頁面是不是跨頁提交)(true 說明是跨頁提交 false 說明不是跨頁提交)

if (PreviousPage.IsCrossPagePostBack)

this.lblShow.Text = "跨頁數據傳遞";
}

Control

FindControl(String ID)

在頁命名容器中搜索帶指定標識符的服務器控件。

((TextBox)this.PreviousPage.FindControl("txtKeyWord")).Text;

 

ASP.NET頁面傳值

頁內傳值

//傳遞
protected void Page_Load(object sender, EventArgs e){
  if (!IsPostBack) {
    this.txtName.Text = "
請在此輸入用戶名";      this.txtPwd.Text = "請在此輸入密碼";}}
//
接收數據
protected void btnSub_Click(object sender, EventArgs e){
  Response.Write(this.this.txtName.Text + <br/>; + this.txtPwd.Text);}

跨頁傳值

//接收數據
protected void Page_Load(object sender, EventArgs e){
  if (Page.PreviousPage != null) {
    if (PreviousPage.IsCrossPagePostBack) {
      this.lblName.Text = "
 名:" + ((TextBox)this.PreviousPage.FindControl("txtName")).Text;
    }}}

 

頁面跳轉

重定向

Response.Redirect

(String URL)

protected void btnSub_Click(object sender, EventArgs e){
  if(this.txtName.Text.Trim()=""||this.txtPwd.Text.Trim()=="") 

{ Response.Write("請輸入姓名或密碼");

 }else{Response.Redirect("welcome.aspx");  }    }

使用Button自帶的屬性

PostBackUrl單擊按鈕時所發送到的 URL

       

單擊按鈕頁面跳轉傳參
    //
傳參  protected void btnSub_Click(object sender, EventArgs e) {

Response.Write("<script>window.location.href='BookDetail.aspx?iSBN="+this.txtISBN.Text+"'</script>"); 
      //Response.Redirect("BookDetail.aspx?iSBN=" + this.txtISBN.Text); }
    //
接受
    protected void Page_Load(object sender, EventArgs e)  {
        if (Request.QueryString["iSBN"] != null)    {
            iSBN = Request.QueryString["iSBN"].Trim();
            this.ShowBook(id, iSBN);
        }    }
 Cookie
對象保持於客戶端的共享信息方式

單個寫入形式

Response.Cookies["Cookie 的名稱"].Value=變量值; //寫入 Cookie
Response.Cookies("Cookie 
的名稱").Expires= DateTime.Now.AddMonths(1); //設置 Cookie 時間(有效期爲一個月)
string 
變量名=Request.Cookies["Cookie 的名稱"].Value; //讀取 Cookie

使用數組類型形式

HttpCookie hcCookie = new HttpCookie("Cookie 的名稱","");
hcCookie.Values["
子變量名稱1"] = 變量值;
hcCookie.Values["
子變量名稱2"] = 變量值;
hcCookie.Expires = DateTime.Now.AddMonths(1); //
有效期爲一個月
Response.Cookies.Add(hcCookie);
string 
變量名1 = Request.Cookies["Cookie 的名稱"]["counts"]; //讀取 Cookie

Session 對象爲某個用戶提供共享信息,做用於用戶會話期
語法:Session["Session 名稱"] = ; //存儲     變量 = Session["Session 名稱"] as 對象名; //讀取

Session對象的經常使用屬性和方法

屬性和方法

說明

SessionID 屬性

包含惟一的的用戶會話標識符,它可用於在整個會話過程當中記錄用戶信息

Timeout 屬性

用戶設置用戶超時的時間,單位爲分鐘。在該段時間內,用戶即便沒有任何操做,用戶狀態也不會被清除,注意此設置是針對服務器清除Session的時間而言,由於若是一段時間內沒有操做,服務器是沒法知道用戶是否在線,因此一超時時間爲限。而客戶端有本身的處理機制,不一樣的瀏覽器也不盡相同,通常關閉窗口就會形成Session失效。(默認爲20分鐘)

IsNewSession 屬性

若是已按當前請求建立會話,那麼該屬性將返回true

Clear 方法

從會話狀態集合中移除全部的鍵和值

Abandon方法

結束Session,取消當前會話(當前頁面全部代碼都執行結束之後纔會執行)

Application 對象爲全部用戶提供共享信息,做用於整個應用程序運行期:
語法:Application["Application 名稱"] = ;     變量 = Application["Application 名稱"]

Application 對象的經常使用屬性

 

說明

屬性

All

返回所有的 Application 對象變量到一個對象數組

AllKeys

返回所有的 Application 對象變量到一個字符串數組

Count

取消 Application 對象變量的數值

Item

容許使用索引或 Application 變量名稱傳回內容值

方法

Add

新增一個 Application 對象變量

 

 

Clear

清楚所有的 Application 對象變量

Get

使用索引值或變量名稱傳回變量值

Set

使用變量名稱更新一個 Application 對象變量的內容

Lock

鎖定所有的 Application 變量

UnLock

解除鎖定 Application 變量

ViewState
Server
對象該對對象是 JSP中沒有的,它提供了服務期端的一些屬性和方法。

Server對象的經常使用方法

HtmlEncode

此方法帶有一個字符串參數,能夠將其編碼,使其在瀏覽器中正確顯示。好比但願在頁面輸入一個"<br>",又不想在瀏覽器中顯示成換行,則須要使用該方法

HtmlDecode

此方法與HtmlEncode方法相反,對以編碼內容解碼

MapPath

此方法帶有一個虛擬路徑,可返回該路徑的物理磁盤中的準去位置。此方法在Web開發過程當中使用頻率比較高。通常實現文件讀寫都須要該方法

UrlEncode

URL地址進行編碼。對於URL須要傳輸含有"#""&"等特殊自負的參數時,須要進行編碼,不然後面的內容不會被識別

Execute

在當前頁面執行參數指定的頁面,執行完後繼續執行本頁面

Transfer

參數指定的頁面處理完成後,頁面執行就結束,不像Execute那樣還要返回控制權給先前的頁面

 

Application,Session,Cookie,ViewStateCache用法和區別

內置對象

信息量大小

做用域和保存時間

應用範圍

保存位置

Application

任意大小

整個應用程序的生命期

整個應用程序/全部用戶

服務器端

Cache

任意大小

能夠根據須要設定

整個應用程序/全部用戶

服務器端

Session

小量,簡單的數據

用戶活動時間+一段延遲時間(通常爲20分鐘)

單個用戶

服務器端

Cookie

小量,簡單的數據

能夠根據須要設定

單個用戶

客戶端

Viewstate

小量,簡單的數據

一個Web頁面的生命期

單個用戶

客戶端

隱藏域

小量,簡單的數據

一個Web頁面的生命期

單個用戶

客戶端

查詢字符串

小量,簡單的數據

直到下次頁面跳轉請求

單個用戶

客戶端

1.Application對象
Application
用於保存全部用戶的公共的數據信息,若是使用Application對象,一個須要考慮的問題是任何寫操做都要在Application_OnStart事件(global.asax)中完成.儘管使用Application.LockApplicaiton.Unlock方法來避免寫操做的同步,可是它串行化了對Application對象的請求,當網站訪問量大的時候會產生嚴重的性能瓶頸.所以最好不要用此對象保存大的數據集合下面咱們作個在線用戶統計的例子來講明這個問題:
(
以文件的形式存放網站總訪問量)
Code       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,總訪問數+
   {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
用於保存每一個用戶的專用信息.每一個客戶端用戶訪問時,服務器都爲每一個用戶分配一個惟一的會話IDSession 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"]

相關文章
相關標籤/搜索