1.global.asax
Global.asax 檔案(也稱為 ASP.NET 應用程式檔案)是一個可選的檔案,該檔案包含響應 ASP.NET 或HTTP模組所引發的應用程式層級和會話層級事件的代碼。Global.asax 檔案駐留在 ASP.NET 應用程式的根目錄中。運行時,分析 Global.asax 並將其編譯到一個動態產生的 .NET Framework 類,該類是從HttpApplication基類派生的。配置 ASP.NET,以便自動拒絕對 Global.asax 檔案的任何直接的 URL 請求;外部使用者不能下載或查看其中的代碼。Global.asax 檔案是可選的。只在希望處理應用程式事件或會話事件時,才應建立它.
Global.asax檔案主要用來處理更進階別的應用程式事件,如Application_Start、Application_End、Session_Start、Session_End等。開發人員使用位於特定Web應用程式根目錄下的Global.asax檔案來創作此邏輯。第一次啟用或請求應用程式命名空間內的任何資源或URL時,ASP.NET會將其Global.asax檔案編譯為從HttpApplication類派生而來的一個類。
global.asax的方法介紹:
Global.asax.cs中的方法的含義
Application_Init:在每一個HttpApplication執行個體初始化的時候執行
Application_Disposed:在每一個HttpApplication執行個體被銷毀之前執行
Application_Error:所有沒有處理的錯誤都會導致這個方法的執行
Application_Start:在程式初始化的時候執行。在Web應用程式的生命週期裡就執行一次,這裡只能放一些公用的資訊,比如HttpApplicationState。
Application_End:應用程式結束時,在最後一個HttpApplication銷毀之後執行。對應Application_Start,在整個生命週期裡面也是只執行一次。
Session_Start:會話開始時執行。
Session_End:會話結束或到期時執行。
Application_BeginRequest:BeginRequest是在收到Request時第一個觸發的事件,這個方法第一個執行。
Application_AuthenticateRequest:當安全模組已經建立了目前使用者的標識後執行。
Application_AuthorizeRequest:當安全模組已經驗證了目前使用者的授權時執行。
Application_ResolveRequestCache:當ASP.NET完成授權事件以使緩衝模組從緩衝中為請求提供服務時發生,從而跳過處理常式(頁面或者是WebService)的執行。這樣做可以改善網站的效能,這個事件還可以用來判斷本文是不是從Cache中得到的。
Application_AcquireRequestState:當ASP.NET擷取當前請求所關聯的目前狀態(如Session)時執行。
Application_PreRequestHandlerExecute:當ASP.Net即將把請求發送到處理常式對象(頁面或者是WebService)之前執行。這個時候,Session就可以用了。
Application_PostRequestHandlerExecute:當處理常式對象工作完成後執行。
Application_ReleaseRequestState:在ASP.NET執行完所有請求處理常式後執行。ReleaseRequestState事件將使目前狀態資料被儲存。
Application_UpdateRequestCache:在ASP.NET執行完處理常式後為了後續的請求而更新響應緩衝時執行。
Application_EndRequest:同上,EndRequest是在響應Request時最後一個觸發的事件,這個方法自然就是最後一個執行的了。
Application_PreSendRequestHeaders:向用戶端發送Http標題之前執行。
Application_PreSendRequestContent:向用戶端發送Http本文之前執行。
Request相應的事件執行順序:
1.BeginRequest
2.AuthenticateRequest
3.AuthorizeRequest
4.ResolveRequestCache
5.AcquireRequestState
6.PreRequestHandlerExecute
7.PostRequestHandlerExecute
8.ReleaseRequestState
9.UpdateRequestCache
10.EndRequest
注釋:這個檔案是可以滿足一些應用程式級代碼的邏輯需求。
void Application_Start(object sender, EventArgs e)
{
}
是只有在第一次啟動並執行時候才執行,在整個應用程式周期只執行一次,當重啟後IIS不一定會執行,IIS還把資料儲存在記憶體中?只有修改了檔案,再接到第一個請求的時候會執行。所以當這個已經執行過一遍,後面不管誰發起訪問都不會再執行這個事件。
如果你需要每個發起每個人每個訪問都運行那麼應該寫到
void Session_Start(object sender, EventArgs e)
{
HttpContext.Current.Session.Timeout = Convert.ToInt32(ConfigurationManager.AppSettings["SessionTimeOut"]);
}
2.COOKIE
這個儲存在用戶端的資訊,使用者清除了本機上的COOKIE檔案或到期了就沒有了。
儲存在用戶端,通過 Expries 設定有效期間(可長可短,預設關閉瀏覽器cookie即失效)。
建立項並賦值
Response.Cookies["ckName"].Value = "Sutdent";
Response.Cookies["ckName"].Expires = DateTime.Now.AddSeconds(10); // 如果不設定到期時間,預設關閉瀏覽器該cookie即失效
建立項,為不同子鍵賦值
Response.Cookies["ckAge"]["boy"] = "25";
Response.Cookies["ckAge"]["girl"] = "22";
Response.Cookies["ckAge"].Expires = DateTime.Now.AddHours(1);
// Response.Cookies["ckAge"].Expires = DateTime.Now.AddHours(-1); // 通過設定到期時間來清除cookie
3.CACHE
應用程式級變數,存於伺服器緩衝中被所有使用者共用,由系統自動分配和回收,使用Cache["name"]==null?判斷是否到期。
Cache["number"] = "65464646";
Cache["ca"] = "aaa";
Cache["cb"] = "bbb";
lbNumber.Text +="OldCache value:"+ Cache["number"].ToString();
清空緩衝
IDictionaryEnumerator ide = Cache.GetEnumerator();
while (ide.MoveNext())
{
Cache.Remove(ide.Key.ToString());
}
lbNumber.Text += "點擊清空後的cache數量:" + Cache.Count;
在用戶端是無法清空和重新整理的,如果要的話可能要修改WEB.CONFIG和IIS的重啟,或者提供頁面方法,觸發清楚
4.SESSION
頁面級變數,儲存在伺服器端,通過 Timeout 設定逾時時間(可長可短,預設30分鐘)。
系統為每位訪問者自動分配一個 sessionid(逾時重新分配),使之互不影響,生命週期與訪問者會話時間相同。
Session["scName"] = string.IsNullOrEmpty(scName.Value)?"default session string":scName.Value;
Session.Timeout = 11; // 時間單位是分鐘
lbSession.Text = Session["scName"].ToString();
通過項名稱刪除 session
Session.Remove("scName"); // 刪除單條session
Session.Clear(); // 清空session
lbSession.Text = "session is clesred, please refreash.";
session的工作原理
一直在使用session儲存資料,一直沒有好好總結一下session的使用方式以及其工作原理,今天在這裡做一下梳理。
這裡的介紹主要是基於php語言,其他的語言操作可能會有差別,但基本的原理不變。
1.在php中如何操作session:
session_start(); //使用該函數開啟session功能
$_SESSION //使用預定義全域變數操作資料
使用unset($_SESSION['key']) //銷毀一個session的值
簡單地操作,一切都是由伺服器實現;由於處理在後台,一切看起來也很安全。但是session採用什麼樣機制,又是怎樣被實現,並且如何來保持會話的狀態的呢?
2.session實現與工作原理
瀏覽器和伺服器採用http無狀態的通訊,為了保持用戶端的狀態,使用session來達到這個目的。然而服務端是怎麼樣標示不同的用戶端或使用者呢?
這裡我們可以使用生活中的一個例子,假如你參加一個晚會,認識了很多人,你會採取什麼方式來區分不同的人呢!你可能根據臉型,也有可能根據使用者的名字,
或者人的身份證,即採用一個獨一無二的標示。在session機制中,也採用了這樣的一個唯一的session_id來標示不同的使用者,不同的是:瀏覽器每次請求都會帶上
由伺服器為它產生的session_id.
簡單介紹一下流程:當Client Access Server時,伺服器根據需求設定session,將會話資訊儲存在伺服器上,同時將標示session的session_id傳遞給用戶端瀏覽器,
瀏覽器將這個session_id儲存在記憶體中(還有其他的儲存方式,例如寫在url中),我們稱之為無到期時間的cookie。瀏覽器關閉後,這個cookie就清掉了,它不會存在使用者的cookie臨時檔案。
以後瀏覽器每次請求都會額外加上這個參數值,再伺服器根據這個session_id,就能取得用戶端的資料狀態。
如果用戶端瀏覽器意外關閉,伺服器儲存的session資料不是立即釋放,此時資料還會存在,只要我們知道那個session_id,就可以繼續通過請求獲得此session的資訊;但是這個時候背景session還存在,但是session的儲存有一個到期
時間,一旦超過規定時間沒有用戶端請求時,他就會清除這個session。
下面介紹一下session的儲存機制,預設的session是儲存在files中,即以檔案的方式儲存session資料。在php中主要根據php.ini的配置session.save_handler
來選擇儲存session的方式。
這裡順便說明一下,如果要做伺服器的lvs,即多台server的話,我們一般使用memcached的方式session,否則會導致一些請求找不到session。
一個簡單的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
當然如果一定要使用files檔案快取,我們可以將檔案作nfs,將所有的儲存session檔案定位到一個地方。
剛才講返回給使用者的session-id最終儲存在記憶體中,這裡我們也可以設定參數將其儲存在使用者的url中。
3.執行個體問題
現有系統A,B; 假設A系統是可以獨立啟動並執行web系統,即可以和瀏覽器直接處理session, B系統是基於mobile的,需要調用A系統的功能介面,
在保持A不改變的情況下,即登陸驗證,session儲存都不變的情況下,B系統能處理前端使用者的請求。
這裡提供的方案是使用PHP實現
在使用者登陸成功後,將儲存的session的session-id返回給B系統,然後B系統每次請求其他介面都帶session_id。
A系統在session_start前加上session_id(session_id);
這樣B系統就能安全的調用A
因為他的檔案有一些還是儲存在用戶端的,所以清楚用戶端最近記錄檔案,有時也會造成SEESSION失效
6.VIEWSTATE
頁面級變數(可以看作頁面Session),可儲存各種變數。
儲存變數到 ViewState
ViewState["number"]=123456;
ViewState["table"]=DataTable; // 存放DataTable、Hashtable…對象
讀取 ViewState
times=(int)ViewState["number"];
table=(DataTable)ViewState["table"];
Application
應用程式級變數,被所有使用者共用使用,生命週期與伺服器已耗用時間相同。道理和第一點Application_Start事件的原理差不多。
一直在使用session儲存資料,一直沒有好好總結一下session的使用方式以及其工作原理,今天在這裡做一下梳理。
這裡的介紹主要是基於php語言,其他的語言操作可能會有差別,但基本的原理不變。
1.在php中如何操作session:
session_start(); //使用該函數開啟session功能
$_SESSION //使用預定義全域變數操作資料
使用unset($_SESSION['key']) //銷毀一個session的值
簡單地操作,一切都是由伺服器實現;由於處理在後台,一切看起來也很安全。但是session採用什麼樣機制,又是怎樣被實現,並且如何來保持會話的狀態的呢?
2.session實現與工作原理
瀏覽器和伺服器採用http無狀態的通訊,為了保持用戶端的狀態,使用session來達到這個目的。然而服務端是怎麼樣標示不同的用戶端或使用者呢?
這裡我們可以使用生活中的一個例子,假如你參加一個晚會,認識了很多人,你會採取什麼方式來區分不同的人呢!你可能根據臉型,也有可能根據使用者的名字,
或者人的身份證,即採用一個獨一無二的標示。在session機制中,也採用了這樣的一個唯一的session_id來標示不同的使用者,不同的是:瀏覽器每次請求都會帶上
由伺服器為它產生的session_id.
簡單介紹一下流程:當Client Access Server時,伺服器根據需求設定session,將會話資訊儲存在伺服器上,同時將標示session的session_id傳遞給用戶端瀏覽器,
瀏覽器將這個session_id儲存在記憶體中(還有其他的儲存方式,例如寫在url中),我們稱之為無到期時間的cookie。瀏覽器關閉後,這個cookie就清掉了,它不會存在使用者的cookie臨時檔案。
以後瀏覽器每次請求都會額外加上這個參數值,再伺服器根據這個session_id,就能取得用戶端的資料狀態。
如果用戶端瀏覽器意外關閉,伺服器儲存的session資料不是立即釋放,此時資料還會存在,只要我們知道那個session_id,就可以繼續通過請求獲得此session的資訊;但是這個時候背景session還存在,但是session的儲存有一個到期
時間,一旦超過規定時間沒有用戶端請求時,他就會清除這個session。
下面介紹一下session的儲存機制,預設的session是儲存在files中,即以檔案的方式儲存session資料。在php中主要根據php.ini的配置session.save_handler
來選擇儲存session的方式。
這裡順便說明一下,如果要做伺服器的lvs,即多台server的話,我們一般使用memcached的方式session,否則會導致一些請求找不到session。
一個簡單的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
當然如果一定要使用files檔案快取,我們可以將檔案作nfs,將所有的儲存session檔案定位到一個地方。
剛才講返回給使用者的session-id最終儲存在記憶體中,這裡我們也可以設定參數將其儲存在使用者的url中。
3.執行個體問題
現有系統A,B; 假設A系統是可以獨立啟動並執行web系統,即可以和瀏覽器直接處理session, B系統是基於mobile的,需要調用A系統的功能介面,
在保持A不改變的情況下,即登陸驗證,session儲存都不變的情況下,B系統能處理前端使用者的請求。
這裡提供的方案是使用PHP實現
在使用者登陸成功後,將儲存的session的session-id返回給B系統,然後B系統每次請求其他介面都帶session_id。
A系統在session_start前加上session_id(session_id);
這樣B系統就能安全的調用A