ASP.NET常見物件之Cookie、Session與Application

gaibian0823發表於2015-08-23

    在上篇部落格中,我們研究了Response和Request,在解決了基本傳值問題後,我們會發現一些問題,像兩個頁面之間傳值,登入的時候我要保持會話狀態,統計一個網站的實時線上人數,response和request解決起來,並不方便,甚至有的不能解決。所以我們引入了Cookie、 Session與Application.

一、Application物件

    Application 用於儲存所有使用者的公共的資料資訊,如果使用Application物件,一個需要考慮的問題是任何寫操作都要在Application_OnStart 事件(global.asax)中完成.儘管使用Application.Lock和Applicaiton.Unlock方法來避免寫操作的同步,但是 它序列化了對Application物件的請求,當網站訪問量大的時候會產生嚴重的效能瓶頸.因此最好不要用此物件儲存大的資料集合。

    1.Application 物件在實際網路開發中的用途就是記錄整個網路的資訊,如上線人數、線上名單、意見調查和網上選舉等。在給定的應用程式的多有使用者之間共享資訊,並在伺服器執行期間持久的儲存資料。而且Application物件還有控制訪問應用層資料的方法和可用於在應用程式啟動和停止時觸發過程的事件。
   (1).使用Application物件儲存資訊
   Application(“鍵名”) = 值 或Application(“鍵名”,值)
   (2).獲取Application物件資訊
   變數名 = Application(“鍵名”) 或:變數名 = Application.Item(“鍵名”) 或:變數名 =      Application.Get(“鍵名”)
   (3).更新Application物件的值
   Application.Set(“鍵名”, 值)
   (4).刪除一個鍵
   Application.Remove(“鍵名”, 值)
   (5).刪除所有鍵
   Application.RemoveAll() 或Application.Clear()
    2.有可能存在多個使用者同時存取同一個Application物件的情況。這樣就有可能出現多個使用者修改同一個Application命名物件,造成資料不一致的問題。
    HttpApplicationState 類提供兩種方法 Lock和Unlock,以解決對Application物件的訪問同步問題,一次只允許一個執行緒訪問應用程式狀態變數。
    關於鎖定與解鎖
    鎖定:Application.Lock()
    訪問:Application(“鍵名”) = 值
    解鎖:Application.Unlock()
    注意:Lock方法和UnLock方法應該成對使用。 可用於網站訪問人數,聊天室等裝置
    3.使用Application事件
    在ASP.NET 應用程式中可以包含一個特殊的可選檔案——Global.asax檔案,也稱作 ASP.NET 應用程式檔案,它包含用於響應ASP.NET或HTTP模組引發的應用程式級別事件的程式碼。
Global.asax 檔案提供了7個事件,其中5個應用於Application物件

二、Session物件

    Session用於儲存每個使用者的專用資訊.每個客戶端使用者訪問時,伺服器都為每個使用者分配一個唯一的會話ID(Session ID) . 她的生存期是使用者持續請求時間再加上一段時間(一般是20分鐘左右).Session中的資訊儲存在Web伺服器內容中,儲存的資料量可大可小.

    當Session超時或被關閉時將自動釋放儲存的資料資訊.由於使用者停止使用應用程式後它仍然在記憶體中保持一段時間,因此使用Session物件使儲存使用者資料的方法效率很低.對於小量的資料,使用Session物件儲存還是一個不錯的選擇.

    Session 物件就是伺服器給客戶端的一個編號。當一臺WEB伺服器執行時,可能有若干個使用者瀏覽正在瀏覽這臺伺服器上的網站。當每個使用者首次與這臺WWW伺服器建立 連線時,他就與這個伺服器建立了一個Session,同時伺服器會自動為其分配一個SessionID,用以標識這個使用者的唯一身份。特別說明的是 Session物件的變數只是對一個使用者有效,不同的使用者的會話資訊用不同的Session物件的變數儲存。在網路環境下Session物件的變數是有生 命週期的,如果在規定的時間沒有對Session物件的變數重新整理,系統會終止這些變數。

    Session即會話,是指一個使用者在一段時間內對某一個站點的一次訪問。
    Session物件在.NET中對應HttpSessionState類,表示“會話狀態”,可以儲存與當前使用者會話相關的資訊。
    Session物件用於儲存從一個使用者開始訪問某個特定的aspx的頁面起,到使用者離開為止,特定的使用者會話所需要的資訊。使用者在應用程式的頁面切換時,Session物件的變數不會被清除。
對 於一個Web應用程式而言,所有使用者訪問到的Application物件的內容是完全一樣的;而不同使用者會話訪問到的   Session物件的內容則各不相同。

    Session可以儲存變數,該變數只能供一個使用者使用,也就是說,每一個網頁瀏覽者都有自己的Session物件變數,即Session物件具有唯一 性。
   (1)將新的項新增到會話狀態中
   Session ("鍵名")= 值 或者 Session.Add( "鍵名", 值)
   (2)按名稱獲取會話狀態中的值
   變數 = Session ("鍵名")或者 變數 = Session.Item("鍵名")
   (3)刪除會話狀態集合中的項
    Session.Remove("鍵名")
   (4)清除會話狀態中的所有值
    Session.RemoveAll() 或者Session.Clear()
   (5)取消當前會話
    Session.Abandon()
   (6)設定會話狀態的超時期限,以分鐘為單位。
    Session.TimeOut = 數值
   Global.asax 檔案中有2個事件應用於Session物件
   Session_Start 在會話啟動時激發
   Session_End 在會話結束時激發

   application物件與session物件結合的例子:

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Data.SqlClient;

namespace applicationExample

{
    public class Global : System.Web.HttpApplication

    {
        protected void Application_Start(object sender, EventArgs e)

        {
            SqlConnection con = new SqlConnection("server=.;database=countPeople;uid=sa;pwd=123456;");
            con.Open();
            SqlCommand cmd =new SqlCommand("select * from countPeople",con);
            intcount = Convert.ToInt32(cmd.ExecuteScalar());
            con.Close();
            Application["total"]= count;
            Application["online"] = 0<span style="font-family:KaiTi_GB2312;">;</span>
        }
        protected void Session_Start(object sender, EventArgs e)

        {
           Session.Timeout = 1;
           Application.Lock();
           Application["total"] = (int)Application["total"] +1;
           Application["online"] = (int)Application["online"] +1;
           Application.UnLock();
        }
        protected void Application_BeginRequest(object sender, EventArgs e)

        {
        }
        protected void Application_AuthenticateRequest(object sender, EventArgs e)

        {
        }
        protected void Application_Error(object sender, EventArgs e)

        {
         }
        protected void Session_End(object sender, EventArgs e)
        {
           Application.Lock();
           Application["online"] = (int)Application["online"]-1;
           Application.UnLock();
        }
        protected void Application_End(object sender, EventArgs e)

        {
           SqlConnection con = newSqlConnection("server=.;database=countPeople;uid=sa;pwd=123456;");
           con.Open();
           SqlCommand cmd = new SqlCommand("update countPeople setnum="+Application["total"].ToString(), con);
           cmd.ExecuteNonQuery();
           con.Close();
        }
    }
}
   通過上面我們可以發現,application全域性變數,session是會話變數,比如說:

   (1)session:宣告一個session變數。開啟一個網站,session就存在了,更換頁,只要是這個網站的頁,session始終存在,當關閉這個網站的時候,session就結束了,這叫會話變數。

   (2)application:宣告一個application變數。不關你前臺有多少客戶開啟該網站的頁,有多少客戶關閉該網站的頁,只要伺服器端不關

閉該網站,application始終存在。

三、Cookie物件

    Cookie就是Web伺服器儲存在使用者硬碟上的一段文字。Cookie允許一個Web站點在使用者的電腦上儲存資訊並且隨後再取回它。資訊的片斷以‘鍵/值’對的形式儲存。

    Cookie 用於儲存客戶瀏覽器請求伺服器頁面的請求資訊,程式設計師也可以用它存放非敏感性的使用者資訊,資訊儲存的時間可以根據需要設定.如果沒有設定Cookie失效 日期,它們僅儲存到關閉瀏覽器程式為止.如果將Cookie物件的Expires屬性設定為Minvalue,則表示Cookie永遠不會過 期.

    Cookie儲存的資料量很受限制,大多數瀏覽器支援最大容量為4096,因此不要用來儲存資料集及其他大量資料.由於並非所有的瀏覽器都支援 Cookie,並且資料資訊是以明文文字的形式儲存在客戶端的計算機中,因此最好不要儲存敏感的,未加密的資料,否則會影響網站的安全性.
    有兩種型別的Cookie:會話Cookie(Session Cookie)和永續性Cookie。前者是臨時性的,一旦會話狀態結束它將不復存在;後者則具有確定的過期日期,在過期之前Cookie在使用者的計算機上以文字檔案的形式儲存。
    在伺服器上建立並向客戶端輸出Cookie可以利用Response物件實現。
    Response物件支援一個名為Cookies的集合,可以將Cookie物件新增到該集合中,從而向客戶端輸出Cookie。 通過Request物件的Cookies集合來訪問Cookie。

    js中放到cookie中:

 setCookie('College',strCollege);

 setCookie('CourseId',strCourseId);

    類中拿到cookie:

<span style="font-size:18px;">HttpCookiecookieCollege =System.Web.HttpContext.Current.Request.Cookies.Get("College");

stringstrCollege =Server.UrlDecode(cookieCollege.Value);        

HttpCookie cookieCourseId =System.Web.HttpContext.Current.Request.Cookies.Get("CourseId");

stringstrCourseId = cookieCourseId.Value;</span>

    總結如下:

方法

資訊量大小

儲存時間

應用範圍

儲存位置

Application

任意大小

整個應用程式的生命期

所有使用者

伺服器端

Session

小量,簡單的資料

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

單個使用者

伺服器端

Cookie

小量,簡單的資料

可以根據需要設定

單個使用者

客戶端

    之前你可能還在使用全域性變數,但是那並不是最好的解決辦法,使用cookie、session或者application可以幫助我們更好地解決問題。

相關文章