HttpContext封裝關於單個HTTP請求的全部HTTP特定信息。html
HttpContext基於HttpApplication的處理管道,因爲HttpContext對象貫穿整個處理過程,因此,能夠從HttpApplication處理管道的前端將狀態數據傳遞到管道的後端,完成狀態的傳遞任務。前端
HttpContext類它對Request、Respose、Server等等都進行了封裝,並保證在整個請求週期內均可以隨時隨地的調用;爲繼承 IHttpModule 和 IHttpHandler 接口的類提供了對當前 HTTP 請求的 HttpContext 對象的引用。web
當咱們建立一個通常處理程序Handler.ashx時,咱們能夠在文件中看到這一句 public void ProcessRequest (HttpContext context);sql
在WebForm中是HttpContext,在MVC中是HttpContextBase,數據庫
一、在WebForm或類庫(包括MVC)項目中,經過Current靜態屬性,就可以得到HttpContext的對象。編程
HttpContext context = HttpContext.Current;
二、若是是在Asp.net MVC的Controller中,經過this.HttpContext;就能獲取到HttpContextBase對象。後端
HttpContextBase context = this.HttpContext;
三、若是是在MVC視圖中能夠這樣獲得:api
@Html.ViewContext.HttpContext
Application屬性爲當前 HTTP 請求獲取 HttpApplicationState 對象。數組
Application用來保存全部用戶共用的信息。瀏覽器
在Asp時代,若是要保存的數據在應用程序生存期內不會或者不多發生改變,那麼使用Application是理想的選擇。可是在Asp.net開發環境中咱們把相似的配置數據放在Web.config中。
HttpApplicationState類,經過Page.Application訪問。
若是要使用Application 要注意的是全部的寫操做都要在Application_OnStart事件中完成(global.Asax),儘管可使用Application.Lock()避免了衝突,可是它串行化了對Application的請求,會產生嚴重的性能瓶頸。
不要使用Application保存大數據量信息。
global.asax:
void Application_OnStart() { Application["UserID"] = "test"; String UserName = Application["UserID"].ToString(); //修改 Application.Lock(); Application["count"] = (Application["UserID"] as int) + 1; Application.Unlock(); }
Cache屬性獲取當前應用程序域的 Cache 對象。Cache爲服務端緩存對象。
Cache和Application:用於服務端,整個應用程序、全部用戶擁有。
Cache用於在Http請求期間保存頁面或者數據, Cache的使用能夠大大的提升整個應用程序的效率,它容許將頻繁訪問的服務器資源存儲在內存中,當用戶發出相同的請求後,服務器不是再次處理而是將Cache中保存的數據直接返回給用戶,
能夠看出Cache節省的是時間—服務器處理時間。
Cache實例是每個應用程序專有的,其生命週期==該應用程序週期,應用程序重啓將從新建立其實例
HttpContext.Cache 是對HttpRuntime.Cache 緩存類的封裝,因爲封裝到了 HttpContext ,侷限於只能在 HttpContext 下使用,即只能用於 Web 應用。
綜上所屬,在能夠的條件,儘可能用 HttpRuntime.Cache ,而不是用 HttpContext.Cache 。
Cache.Insert(string key,object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)
Cache["ID"] = "yiner"; //或者 Cache.Insert("ID", "test");//能夠緩存任何對象,好比:DataTable //緩存依賴 CacheDependency cachedep = new CacheDependency(Server.MapPath("~/App_Data/data.xml")); Cache.Insert("ID", "test", cachedep);//當data.xml更改是,該緩存自動刪除 //設置過時時間:後兩個參數依次爲:過時的絕對時間、過時的相對時間 Cache.Insert("ID", "test", null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration); Cache.Insert("ID", "test", null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 10, 0));
Cache.Remove("ID");
例如你存的是一個DataTable對象,調用以下:
DataTable finaltable = Cache["ID"] as DataTable; //或 DataTable finaltable = (DataTable)Cache.Get("ID")
cache通常用於數據較固定,訪問較頻繁的地方,例如在前端進行分頁的時候,初始化把數據放入緩存中,而後每次分頁都從緩存中取數據,這樣減小了鏈接數據庫的次數,提升了系統的性能。
Request屬性爲當前 HTTP 請求獲取 HttpRequest 對象。
在服務器收到客戶端的請求後,HttpRuntime將會建立一個HttpRequest對象的實例,這個實例就是咱們在頁面中經常使用的Request。可經過HttpContext.Current或Page對象來訪問:
在客戶端的請求內容中,主要包含三部份內容。請求行,請求頭部,請求主體,在下面的屬性中,咱們可一一獲取到這些信息。
注意:
Request對象的Browser屬性來獲取客戶端瀏覽器的一些信息:
Response屬性獲取當前 HTTP 響應的 HttpResponse 對象。
封裝來自 ASP.NET 操做的 HTTP 響應信息。
備註:在代碼中,HttpResponse的對象引用由關鍵字
Response
。 例如,Response.Clear()
是指HttpResponse.Clear方法。 Page類具備名爲的屬性Response的當前實例。
HttpResponse類的方法和屬性經過HttpApplication、 HttpContext、Page、UserControl類的Response的屬性進行公開。
在Asp.net WebForm中,Server屬性獲取提供用於處理 Web 請求的方法的 HttpServerUtility 對象。而在Asp.net MVC中,Server對象是HttpServerUtilityBase對象。
經過Page.Server屬性訪問,提供用於對Web請求的Help方法。
MachineName: 獲取服務器的計算機名稱。
ScriptTimeout: 獲取和設置請求超時值(以秒計)。
context.Response.Write(context.Server.MapPath("/")); //輸出 C:\Users\Administrator\Desktop\WebApplication1\WebApplication1\ //該方法常常用,將虛擬路徑轉換爲物理路徑 context.Response.Write("<div style='background-color:red'>HtmlEncode測試</div>"); //若是不編碼,默認就是會被瀏覽器解析的 context.Response.Write(context.Server.HtmlEncode("<div style='background-color:red'>HtmlEncode測試</div>")); //通過編碼以後 原樣輸出
在網絡狀態較好的狀況下,Redirect(url)方法效率最高!! 可重定向到同一臺或非同一臺服務器上的aspx或非aspx(html)資源。
Server.Transfer方法和Server.Execute方法最靈活!! 但只能轉到同一Application目錄下,也有可能致使不指望的結果發生。
Server.Execute方法佔用資源最多.
Session屬性爲當前 HTTP 請求獲取 HttpSessionState 對象。
Session用來保存每個用戶的專有信息。 HttpSessionState類經過HttpContext或Page對象的Session屬性訪問。一臺客戶機上多個瀏覽器窗口訪問只有一個Session。
Session的生存期是用戶持續請求時間加上一段時間(通常是20分鐘左右), Session超時或者被關閉將自動釋放數據信息,因爲用戶中止使用應用程序以後它仍在內存中存留一段時間,所以這種方法效率較低。
Session信息是保存在Web服務器內存中的,保存數據量可大可小。
在Web.config中的 <system.web> </system.web>之間添加
<sessionState mode="InProc"//InProc:保存到內存,Off;StateServer;SQLServer等 stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" //若是cookieless=true表示不用Cookie,用URL查詢字符串傳送會話ID。 timeout="20" />
其中timeout是過時時間,如20分鐘後超時。
//添加: Session["userName"] = "aaa"; //獲取: if (Session["userName"] != null) { string str = Session["userName"].ToString(); } //清除某個Session Session["UserName"] = null; Session.Remove("UserName"); //清除所有Session Session.Clear();
User的屬性提供對IPrincipal接口的屬性和方法的編程訪問。
這個屬性能讓咱們訪問各類信息,包括用戶是否已驗證,用戶的類型,用戶名等等,咱們還能夠對該屬性的功能進性擴展,以實現咱們的要求。
分配給HttpContext.User的對象必須實現IPrincipal接口,而Iprincipal定義的屬性之一是Identity,它必須實現Iidentity接口。
if (User.Identity.IsAuthenticated) { Page.Title = "Home page for " + User.Identity.Name; } else { Page.Title = "Home page for guest user."; }
參考: