HttpContext對象下的屬性Application、Cache、Request、Response、Server、Session、User

概述:

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 對象。
  • Cache :  獲取當前應用程序域的 Cache 對象。
  • Request  :  爲當前 HTTP 請求獲取 HttpRequest 對象。
  • Response  :  獲取當前 HTTP 響應的 HttpResponse 對象。
  • Server   : 獲取提供用於處理 Web 請求的方法的 HttpServerUtility 對象。
  • Session    :爲當前 HTTP 請求獲取 HttpSessionState 對象。
  • User    :爲當前 HTTP 請求獲取或設置安全信息。

1、Application屬性

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();
}

2、Cache屬性

Cache屬性獲取當前應用程序域的 Cache 對象。Cache爲服務端緩存對象。

Cache和Application:用於服務端,整個應用程序、全部用戶擁有。

Cache用於在Http請求期間保存頁面或者數據, Cache的使用能夠大大的提升整個應用程序的效率,它容許將頻繁訪問的服務器資源存儲在內存中,當用戶發出相同的請求後,服務器不是再次處理而是將Cache中保存的數據直接返回給用戶,

能夠看出Cache節省的是時間—服務器處理時間。

Cache實例是每個應用程序專有的,其生命週期==該應用程序週期,應用程序重啓將從新建立其實例

HttpContext.Cache 是對HttpRuntime.Cache 緩存類的封裝,因爲封裝到了 HttpContext ,侷限於只能在 HttpContext 下使用,即只能用於 Web 應用。

綜上所屬,在能夠的條件,儘可能用 HttpRuntime.Cache ,而不是用 HttpContext.Cache 。

1.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));

2.銷燬Cache

Cache.Remove("ID");

3.調用Cache

例如你存的是一個DataTable對象,調用以下:

DataTable finaltable = Cache["ID"] as DataTable;
//
DataTable finaltable = (DataTable)Cache.Get("ID")

4.通常何時選用Cache

cache通常用於數據較固定,訪問較頻繁的地方,例如在前端進行分頁的時候,初始化把數據放入緩存中,而後每次分頁都從緩存中取數據,這樣減小了鏈接數據庫的次數,提升了系統的性能。

3、Request屬性

Request屬性爲當前 HTTP 請求獲取 HttpRequest 對象。

在服務器收到客戶端的請求後,HttpRuntime將會建立一個HttpRequest對象的實例,這個實例就是咱們在頁面中經常使用的Request。可經過HttpContext.Current或Page對象來訪問:

在客戶端的請求內容中,主要包含三部份內容。請求行,請求頭部,請求主體,在下面的屬性中,咱們可一一獲取到這些信息。

  • Request.RequestType:獲取客戶端的請求方式,即Get或Post:GET
  • Request.HttpMethod:獲取客戶端使用的 HTTP 數據傳輸方法(如 GET、POST 或 HEAD):GET
  • Request.AcceptTypes:獲取客戶端支持的 MIME 接受類型的字符串數組:*/*
  • Request.RawUrl:獲取當前請求的原始URL:/WebForm1.aspx?id=a,RawUrl不包含主機信息和端口號
  • Request.Url:獲取有關當前請求的 URL 的信息:http://localhost:10693/WebForm1.aspx?id=a
  • Request.UrlReferrer:獲取有關客戶端上次請求的 URL 的信息,該請求連接到當前的 URL:
  • Request.FilePath:獲取當前請求的虛擬路徑:/WebForm1.aspx
  • Request.CurrentExecutionFilePath:獲取當前請求的虛擬路徑:/WebForm1.aspx
  • Request.Path:獲取當前請求的虛擬路徑:/WebForm1.aspx
  • Request.AppRelativeCurrentExecutionFilePath:獲取應用程序根的虛擬路徑,並經過對應用程序根使用波形符 (~) 表示法(例如,以「~/page.aspx」的形式)使該路徑成爲相對路徑:~/WebForm1.aspx
  • Request.PhysicalPath:獲取與請求的 URL 相對應的物理文件系統路徑:E:\WebApplication1\WebApplication1\WebForm1.aspx
    • Request.Headers:獲取 HTTP 頭集合:(結果略)
    • Request.Files:獲取客戶端發送的 文件的集合:HttpFileCollection對象
      • Request.QueryString:獲取 HTTP 查詢字符串變量集合:id=a;HtmlForm控件的Method的默認值get,表單數據附在網址後。
      • Request.Form:獲取窗體變量集合:HtmlForm控件的Method的默認值post,表單數據以HTTP標頭形式發送到Server
      • Request.ServerVariables:獲取 Web 服務器變量的集合:Request.ServerVariables["Local_ADDR"] :Server地址 ;Request.ServerVariables["Remote_ADDR"]:客戶端地址。
      • Request.Cookies :Cookies 項的集合HttpCookieCollection對象
      • Request.Params:獲取QueryString、Form、ServerVariables和 Cookies 項的組合集合。(結果略)
      • Request.ContentEncoding:獲取或設置實體主體的字符集:System.Text.UTF8Encoding
      • Request.ContentLength:指定客戶端發送的內容長度(以字節計):0
      • Request.ContentType:獲取或設置傳入請求的 MIME 內容類型:
      • Request.Browser:獲取或設置有關正在請求的客戶端的瀏覽器功能的信息:(結果略)
      • Request.UserAgent:獲取客戶端瀏覽器的原始用戶代理信息:(結果略)
      • Request.UserHostAddress:獲取遠程客戶端的IP主機地址:127.0.0.1
      • Request.UserHostName:獲取遠程客戶端的DNS名稱:127.0.0.1
      • Request.UserLanguages:獲取客戶端語言首選項的排序字符串數組:zh-cn

      注意:

      Request對象的Browser屬性來獲取客戶端瀏覽器的一些信息:

      • Request.Browser.Browser-獲取由瀏覽器在 User-Agent 請求標頭中發送的瀏覽器字符串:IE
      • Request.Browser.MajorVersion--獲取瀏覽器的主(整數)版本號:8
      • Request.Browser.MinorVersion--獲取瀏覽器的次(即小數)版本號:0
      • Request.Browser.ActiveXControls--指示瀏覽器是否支持 ActiveX 控件:True
      • Request.Browser.Cookies--示瀏覽器是否支持 Cookie:True
      • Request.Browser.EcmaScriptVersion--獲取瀏覽器支持的 ECMAScript 的版本號:1.2
      • Request.Browser.W3CDomVersion--獲取瀏覽器支持的萬維網聯合會 (W3C) XML 文檔對象模型 (DOM) 的版本:1.0

      4、Response屬性

      Response屬性獲取當前 HTTP 響應的 HttpResponse 對象。

      封裝來自 ASP.NET 操做的 HTTP 響應信息。

      備註:在代碼中,HttpResponse的對象引用由關鍵字Response。 例如,Response.Clear()是指HttpResponse.Clear方法。 Page類具備名爲的屬性Response的當前實例。

      HttpResponse類的方法和屬性經過HttpApplication、 HttpContext、Page、UserControl類的Response的屬性進行公開。

      一、屬性

      • BufferOutput :   獲取或設置一個值,該值指示是否緩衝輸出並在處理完整個頁以後發送它。
      • Cache :   獲取網頁的緩存策略(例如:過時時間、保密性設置和變化條款)。
      • Cookies :   獲取響應 cookie 集合。
      • Filter  :  獲取或設置一個包裝篩選器對象,該對象用於在傳輸以前修改 HTTP 實體主體。
      • Output  :  啓用到輸出 HTTP 響應流的文本輸出。
      • OutputStream  :  啓用到輸出 HTTP 內容主體的二進制輸出。

      二、方法

      • AddCacheDependency(CacheDependency[])   :  將一組緩存依賴項與響應關聯,這樣,若是響應存儲在輸出緩存中而且指定的依賴項發生變化,就可使該響應失效。
      • RemoveOutputCacheItem(String)  :  從緩存中移除與默認輸出緩存提供程序關聯的全部緩存項。 此方法是靜態的。
      • AddCacheItemDependencies(String[]) :   使緩存項的有效性依賴於緩存中的另外一項。。
      • AddFileDependencies(String[])  :  將文件名數組添加到當前響應依賴的文件名集合中。
      • SetCookie(HttpCookie)  :  更新 Cookie 集合中的一個現有 Cookie。由於 HttpResponse.SetCookie 方法僅供內部使用, 能夠改成調用 HttpResponse.Cookies.Set 方法
      • AppendCookie(HttpCookie)  :  將一個 HTTP Cookie 添加到內部 Cookie 集合。
      • AppendHeader(String, String) :   將 HTTP 頭添加到輸出流。
      • ClearHeaders()  :  清除緩衝區流中的全部頭。
      • Redirect(String, Boolean)   : 將客戶端重定向到新的 URL。 指定新的 URL 並指定當前頁的執行是否應終止。
      • BinaryWrite(Byte[])  :  將二進制字符串寫入 HTTP 輸出流。
      • Write(String)  :  將一個字符串寫入 HTTP 響應輸出流。
      • WriteFile(String) :   將指定文件的內容做爲文件塊直接寫入 HTTP 響應輸出流。
      • TransmitFile(String)  :  將指定的文件直接寫入 HTTP 響應輸出流,而不在內存中緩衝該文件。
      • Clear()  :  清除緩衝區流中的全部內容輸出。
      • ClearContent()  :  清除緩衝區流中的全部內容輸出。
      • Flush()  :  向客戶端發送當前全部緩衝的輸出。
      • End()  :  將當前全部緩衝的輸出發送到客戶端,中止該頁的執行,並引起 EndRequest 事件。
      • Close()   : 關閉到客戶端的套接字鏈接。

      5、Server屬性

      在Asp.net WebForm中,Server屬性獲取提供用於處理 Web 請求的方法的 HttpServerUtility 對象。而在Asp.net MVC中,Server對象是HttpServerUtilityBase對象。

      經過Page.Server屬性訪問,提供用於對Web請求的Help方法。

      一、屬性

        MachineName:  獲取服務器的計算機名稱。
        ScriptTimeout:   獲取和設置請求超時值(以秒計)。

      二、方法

      • Execute : 在當前請求的上下文中(服務端中)執行指定資源的處理程序,而後將執行返回給調用它的頁。
      • Transfer :  終止當前頁的執行,併爲當前請求開始執行新頁。
        • HtmlEncode/HtmlDecode:   對要在瀏覽器中顯示的字符串進行編碼。/對已被編碼以消除無效 HTML 字符的字符串進行解碼
        • UrlEncode/UrlDecode : 編碼/解碼字符串,以便經過 URL 從 Web 上進行可靠的 HTTP 傳輸。
        • UrlPathEncode: 對 URL 字符串的路徑部分進行 URL 編碼並返回編碼後的字符串。
        • MapPath : 返回與 Web 服務器上的指定虛擬路徑相對應的物理文件路徑。 該方法常用。將虛擬路徑轉換爲服務器物理路徑。
        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>"));  //通過編碼以後 原樣輸出

        三、Server.Execute、Server.Transfer、Response.Redirect區別

        • Server.Execute方法容許當前的ASPX頁面執行一個同一Web服務器上的指定ASPX頁面,當指定的ASPX頁面執行完畢,控制流程從新返回原頁面發出Server.Execute調用的位置。
        • Server.Transfer的跳轉徹底是在服務器端,瀏覽器根本不知道已經跳轉了,所以路徑顯示的仍然是原路徑。
        • Response.Redirect是客戶端發送請求到服務器,服務器執行Response.Redirect以後,返回302,瀏覽器接收到請求後,再次發送一次請求到要跳轉的URL.

        在網絡狀態較好的狀況下,Redirect(url)方法效率最高!! 可重定向到同一臺或非同一臺服務器上的aspx或非aspx(html)資源。
        Server.Transfer方法和Server.Execute方法最靈活!! 但只能轉到同一Application目錄下,也有可能致使不指望的結果發生。
        Server.Execute方法佔用資源最多.

        6、Session屬性

        Session屬性爲當前 HTTP 請求獲取 HttpSessionState 對象。

        Session用來保存每個用戶的專有信息。 HttpSessionState類經過HttpContext或Page對象的Session屬性訪問。一臺客戶機上多個瀏覽器窗口訪問只有一個Session。

        Session的生存期是用戶持續請求時間加上一段時間(通常是20分鐘左右), Session超時或者被關閉將自動釋放數據信息,因爲用戶中止使用應用程序以後它仍在內存中存留一段時間,所以這種方法效率較低。

        Session信息是保存在Web服務器內存中的,保存數據量可大可小。

        一、配置Session

        在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:

        //添加:
        Session["userName"] = "aaa";
        //獲取:
        if (Session["userName"] != null)
        {
            string str = Session["userName"].ToString();
        }
        
        //清除某個Session
        Session["UserName"] = null;
        Session.Remove("UserName");
        
        //清除所有Session
        Session.Clear();

        7、User屬性

        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.";
        }

        參考:

        http://www.javashuo.com/article/p-zjqokswy-gs.html

        相關文章
        相關標籤/搜索