ASP.NET中HttpContext對(duì)象下的屬性介紹
一、HttpContext概述:
HttpContext封裝關(guān)于單個(gè)HTTP請(qǐng)求的所有HTTP特定信息。
HttpContext基于HttpApplication的處理管道,由于HttpContext對(duì)象貫穿整個(gè)處理過程,所以,可以從HttpApplication處理管道的前端將狀態(tài)數(shù)據(jù)傳遞到管道的后端,完成狀態(tài)的傳遞任務(wù)。
HttpContext類它對(duì)Request、Respose、Server等等都進(jìn)行了封裝,并保證在整個(gè)請(qǐng)求周期內(nèi)都可以隨時(shí)隨地的調(diào)用;為繼承 IHttpModule 和 IHttpHandler 接口的類提供了對(duì)當(dāng)前 HTTP 請(qǐng)求的 HttpContext 對(duì)象的引用。
當(dāng)我們創(chuàng)建一個(gè)一般處理程序Handler.ashx時(shí),我們可以在文件中看到這一句:public void ProcessRequest (HttpContext context);
1、訪問方式
1、在WebForm或類庫(kù)(包括MVC)項(xiàng)目中,通過Current靜態(tài)屬性,就能夠獲得HttpContext的對(duì)象。
HttpContext context = HttpContext.Current;
2、如果是在Asp.net MVC的Controller中,通過this.HttpContext就能獲取到HttpContextBase對(duì)象。
HttpContextBase context = this.HttpContext;
3、如果是在MVC視圖中可以這樣得到:
@Html.ViewContext.HttpContext
2、成員對(duì)象:
- Application:為當(dāng)前 HTTP 請(qǐng)求獲取HttpApplicationState 對(duì)象。
- Cache:獲取當(dāng)前應(yīng)用程序域的Cache 對(duì)象。
- Request:為當(dāng)前 HTTP 請(qǐng)求獲取HttpRequest 對(duì)象。
- Response:獲取當(dāng)前 HTTP 響應(yīng)的HttpResponse 對(duì)象。
- Server:獲取提供用于處理 Web 請(qǐng)求的方法的HttpServerUtility 對(duì)象。
- Session:為當(dāng)前 HTTP 請(qǐng)求獲取HttpSessionState 對(duì)象。
- User:為當(dāng)前 HTTP 請(qǐng)求獲取或設(shè)置安全信息。
二、Application屬性:保存所有用戶共用的信息
Application屬性為當(dāng)前 HTTP 請(qǐng)求獲取 HttpApplicationState 對(duì)象。
Application用來保存所有用戶共用的信息。
在Asp時(shí)代,如果要保存的數(shù)據(jù)在應(yīng)用程序生存期內(nèi)不會(huì)或者很少發(fā)生改變,那么使用Application是理想的選擇。但是在Asp.net開發(fā)環(huán)境中我們把類似的配置數(shù)據(jù)放在Web.config中。
HttpApplicationState類可以通過Page.Application訪問。
如果要使用Application 要注意的是所有的寫操作都要在Application_OnStart事件中完成(global.Asax),盡管可以使用Application.Lock()避免了沖突,但是它串行化了對(duì)Application的請(qǐng)求,會(huì)產(chǎn)生嚴(yán)重的性能瓶頸。
不要使用Application保存大數(shù)據(jù)量信息。
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屬性:當(dāng)前應(yīng)用程序域服務(wù)端緩存對(duì)象
Cache屬性獲取當(dāng)前應(yīng)用程序域的 Cache 對(duì)象。Cache為服務(wù)端緩存對(duì)象。
Cache和Application:用于服務(wù)端,整個(gè)應(yīng)用程序、所有用戶擁有。
Cache用于在Http請(qǐng)求期間保存頁(yè)面或者數(shù)據(jù), Cache的使用可以大大的提高整個(gè)應(yīng)用程序的效率,它允許將頻繁訪問的服務(wù)器資源存儲(chǔ)在內(nèi)存中,當(dāng)用戶發(fā)出相同的請(qǐng)求后,服務(wù)器不是再次處理而是將Cache中保存的數(shù)據(jù)直接返回給用戶,
可以看出Cache節(jié)省的是時(shí)間—服務(wù)器處理時(shí)間。
Cache實(shí)例是每一個(gè)應(yīng)用程序?qū)S械?,其生命周?=該應(yīng)用程序周期,應(yīng)用程序重啟將重新創(chuàng)建其實(shí)例
HttpContext.Cache 是對(duì)底層HttpRuntime.Cache 緩存類的封裝,由于封裝到了 HttpContext ,局限于只能在 HttpContext 下使用,即只能用于 Web 應(yīng)用。
所以在可以的條件,盡量用底層的HttpRuntime.Cache ,而不是用HttpContext.Cache 。
cache一般用于數(shù)據(jù)較固定,訪問較頻繁的地方,例如在前端進(jìn)行分頁(yè)的時(shí)候,初始化把數(shù)據(jù)放入緩存中,然后每次分頁(yè)都從緩存中取數(shù)據(jù),這樣減少了連接數(shù)據(jù)庫(kù)的次數(shù),提高了系統(tǒng)的性能。
1.創(chuàng)建Cache
Cache.Insert(string key,object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)
Cache["ID"] = "yiner"; //或者 Cache.Insert("ID", "test");//可以緩存任何對(duì)象,比如:DataTable //緩存依賴 CacheDependency cachedep = new CacheDependency(Server.MapPath("~/App_Data/data.xml")); Cache.Insert("ID", "test", cachedep);//當(dāng)data.xml更改時(shí),該緩存自動(dòng)刪除 //設(shè)置過期時(shí)間:后兩個(gè)參數(shù)依次為:過期的絕對(duì)時(shí)間、過期的相對(duì)時(shí)間 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.調(diào)用Cache
例如你存的是一個(gè)DataTable對(duì)象,調(diào)用如下:
DataTable finaltable = Cache["ID"] as DataTable; //或 DataTable finaltable = (DataTable)Cache.Get("ID")
四、Request屬性
Request屬性為當(dāng)前 HTTP 請(qǐng)求獲取 HttpRequest 對(duì)象。
在服務(wù)器收到客戶端的請(qǐng)求后,HttpRuntime將會(huì)創(chuàng)建一個(gè)HttpRequest對(duì)象的實(shí)例,這個(gè)實(shí)例就是我們?cè)陧?yè)面中常用的Request。
Request屬性可通過HttpContext.Current或Page對(duì)象來訪問。
在客戶端的請(qǐng)求內(nèi)容中,主要包含三部分內(nèi)容。請(qǐng)求行,請(qǐng)求頭部,請(qǐng)求主體。
1、HttpRequest 對(duì)象的屬性
- Request.Headers:獲取 HTTP 頭集合:(結(jié)果略)
- Request.RequestType:獲取客戶端的請(qǐng)求方式,即Get或Post:GET
- Request.HttpMethod:獲取客戶端使用的 HTTP 數(shù)據(jù)傳輸方法(如 GET、POST 或 HEAD):GET
- Request.AcceptTypes:獲取客戶端支持的 MIME 接受類型的字符串?dāng)?shù)組:*/*
- Request.RawUrl:獲取當(dāng)前請(qǐng)求的原始URL:/WebForm1.aspx?id=a,RawUrl不包含主機(jī)信息和端口號(hào)
- Request.Url:獲取有關(guān)當(dāng)前請(qǐng)求的 URL 的信息:http://localhost:10693/WebForm1.aspx?id=a
- Request.UrlReferrer:獲取有關(guān)客戶端上次請(qǐng)求的 URL 的信息,該請(qǐng)求鏈接到當(dāng)前的 URL:
- Request.FilePath:獲取當(dāng)前請(qǐng)求的虛擬路徑:/WebForm1.aspx
- Request.CurrentExecutionFilePath:獲取當(dāng)前請(qǐng)求的虛擬路徑:/WebForm1.aspx
- Request.Path:獲取當(dāng)前請(qǐng)求的虛擬路徑:/WebForm1.aspx
- Request.AppRelativeCurrentExecutionFilePath:獲取應(yīng)用程序根的虛擬路徑,并通過對(duì)應(yīng)用程序根使用波形符 (~) 表示法(例如,以“~/page.aspx”的形式)使該路徑成為相對(duì)路徑:~/WebForm1.aspx
- Request.PhysicalPath:獲取與請(qǐng)求的 URL 相對(duì)應(yīng)的物理文件系統(tǒng)路徑:E:\WebApplication1\WebApplication1\WebForm1.aspx
- Request.Files:獲取客戶端發(fā)送的 文件的集合:HttpFileCollection對(duì)象
- Request.Form:獲取窗體變量集合:HtmlForm控件的Method的默認(rèn)值post,表單數(shù)據(jù)以HTTP標(biāo)頭形式發(fā)送到Server
- Request.QueryString:獲取 HTTP 查詢字符串變量集合:id=a;HtmlForm控件的Method的默認(rèn)值get,表單數(shù)據(jù)附在網(wǎng)址后。
- Request.ServerVariables:獲取 Web 服務(wù)器變量的集合:Request.ServerVariables["Local_ADDR"] :Server地址 ;Request.ServerVariables["Remote_ADDR"]:客戶端地址。
- Request.Cookies :Cookies 項(xiàng)的集合HttpCookieCollection對(duì)象。
- Request.Params:獲取QueryString、Form、ServerVariables和 Cookies 項(xiàng)的組合集合。(結(jié)果略)
- Request.ContentEncoding:獲取或設(shè)置實(shí)體主體的字符集:System.Text.UTF8Encoding
- Request.ContentLength:指定客戶端發(fā)送的內(nèi)容長(zhǎng)度(以字節(jié)計(jì)):0
- Request.ContentType:獲取或設(shè)置傳入請(qǐng)求的 MIME 內(nèi)容類型:
- Request.Browser:獲取或設(shè)置有關(guān)正在請(qǐng)求的客戶端的瀏覽器功能的信息:(見下面詳解)
- Request.UserAgent:獲取客戶端瀏覽器的原始用戶代理信息:(結(jié)果略)
- Request.UserHostAddress:獲取遠(yuǎn)程客戶端的IP主機(jī)地址:127.0.0.1
- Request.UserHostName:獲取遠(yuǎn)程客戶端的DNS名稱:127.0.0.1
- Request.UserLanguages:獲取客戶端語(yǔ)言首選項(xiàng)的排序字符串?dāng)?shù)組:zh-cn
2、Request.Browser對(duì)象的屬性
Request對(duì)象的Browser屬性來獲取客戶端瀏覽器的一些信息:
- Request.Browser.Browser:獲取由瀏覽器在 User-Agent 請(qǐng)求標(biāo)頭中發(fā)送的瀏覽器字符串:IE
- Request.Browser.MajorVersion:獲取瀏覽器的主(整數(shù))版本號(hào):8
- Request.Browser.MinorVersion:獲取瀏覽器的次(即小數(shù))版本號(hào):0
- Request.Browser.ActiveXControls:指示瀏覽器是否支持 ActiveX 控件:True
- Request.Browser.Cookies:示瀏覽器是否支持 Cookie:True
- Request.Browser.EcmaScriptVersion:獲取瀏覽器支持的 ECMAScript 的版本號(hào):1.2
- Request.Browser.W3CDomVersion:獲取瀏覽器支持的萬維網(wǎng)聯(lián)合會(huì) (W3C) XML 文檔對(duì)象模型 (DOM) 的版本:1.0
五、Response屬性:HTTP 響應(yīng)信息
Response屬性獲取當(dāng)前 HTTP 響應(yīng)的 HttpResponse 對(duì)象。
封裝來自 ASP.NET 操作的 HTTP 響應(yīng)信息。
在代碼中,HttpResponse的對(duì)象引用由關(guān)鍵字Response
。 例如,Response.Clear()
是指HttpResponse.Clear方法。
Page類具有名為的屬性Response的當(dāng)前實(shí)例。
HttpResponse類的方法和屬性通過HttpApplication、 HttpContext、Page、UserControl類的Response的屬性進(jìn)行公開。
1、屬性
- BufferOutput:獲取或設(shè)置一個(gè)值,該值指示是否緩沖輸出并在處理完整個(gè)頁(yè)之后發(fā)送它。
- Cache:獲取網(wǎng)頁(yè)的緩存策略(例如:過期時(shí)間、保密性設(shè)置和變化條款)。
- Cookies:獲取響應(yīng) cookie 集合。
- Filter:獲取或設(shè)置一個(gè)包裝篩選器對(duì)象,該對(duì)象用于在傳輸之前修改 HTTP 實(shí)體主體。
- Output:?jiǎn)⒂玫捷敵?HTTP 響應(yīng)流的文本輸出。
- OutputStream:?jiǎn)⒂玫捷敵?HTTP 內(nèi)容主體的二進(jìn)制輸出。
2、方法
- AddCacheDependency(CacheDependency[]):將一組緩存依賴項(xiàng)與響應(yīng)關(guān)聯(lián),這樣,如果響應(yīng)存儲(chǔ)在輸出緩存中并且指定的依賴項(xiàng)發(fā)生變化,就可以使該響應(yīng)失效。
- RemoveOutputCacheItem(String):從緩存中移除與默認(rèn)輸出緩存提供程序關(guān)聯(lián)的所有緩存項(xiàng)。 此方法是靜態(tài)的。
- AddCacheItemDependencies(String[]):使緩存項(xiàng)的有效性依賴于緩存中的另一項(xiàng)。。
- AddFileDependencies(String[]):將文件名數(shù)組添加到當(dāng)前響應(yīng)依賴的文件名集合中。
- SetCookie(HttpCookie):更新 Cookie 集合中的一個(gè)現(xiàn)有 Cookie。因?yàn)?HttpResponse.SetCookie 方法僅供內(nèi)部使用, 可以改為調(diào)用 HttpResponse.Cookies.Set 方法
- AppendCookie(HttpCookie):將一個(gè) HTTP Cookie 添加到內(nèi)部 Cookie 集合。
- AppendHeader(String, String):將 HTTP 頭添加到輸出流。
- ClearHeaders():清除緩沖區(qū)流中的所有頭。
- Redirect(String, Boolean):將客戶端重定向到新的 URL。 指定新的 URL 并指定當(dāng)前頁(yè)的執(zhí)行是否應(yīng)終止。
- BinaryWrite(Byte[]):將二進(jìn)制字符串寫入 HTTP 輸出流。
- Write(String):將一個(gè)字符串寫入 HTTP 響應(yīng)輸出流。
- WriteFile(String):將指定文件的內(nèi)容作為文件塊直接寫入 HTTP 響應(yīng)輸出流。
- TransmitFile(String):將指定的文件直接寫入 HTTP 響應(yīng)輸出流,而不在內(nèi)存中緩沖該文件。
- Clear():清除緩沖區(qū)流中的所有內(nèi)容輸出。
- ClearContent():清除緩沖區(qū)流中的所有內(nèi)容輸出。
- Flush():向客戶端發(fā)送當(dāng)前所有緩沖的輸出。
- End():將當(dāng)前所有緩沖的輸出發(fā)送到客戶端,停止該頁(yè)的執(zhí)行,并引發(fā) EndRequest 事件。
- Close():關(guān)閉到客戶端的套接字連接。
六、Server屬性
在Asp.net WebForm中,Server屬性獲取提供用于處理 Web 請(qǐng)求的方法的 HttpServerUtility 對(duì)象。而在Asp.net MVC中,Server對(duì)象是HttpServerUtilityBase對(duì)象。
通過Page.Server屬性訪問,提供用于對(duì)Web請(qǐng)求的Help方法。
1、屬性
- MachineName:獲取服務(wù)器的計(jì)算機(jī)名稱。、
- ScriptTimeout:獲取和設(shè)置請(qǐng)求超時(shí)值(以秒計(jì))。
2、方法
- Execute:在當(dāng)前請(qǐng)求的上下文中(服務(wù)端中)執(zhí)行指定資源的處理程序,然后將執(zhí)行返回給調(diào)用它的頁(yè)。
- Transfer:終止當(dāng)前頁(yè)的執(zhí)行,并為當(dāng)前請(qǐng)求開始執(zhí)行新頁(yè)。
- HtmlEncode/HtmlDecode:對(duì)要在瀏覽器中顯示的HTML字符串進(jìn)行編碼。/對(duì)已被編碼以消除無效 HTML 字符的字符串進(jìn)行解碼
- UrlEncode/UrlDecode:編碼/解碼URL字符串,以便通過 URL 從 Web 上進(jìn)行可靠的 HTTP 傳輸。
- UrlPathEncode:對(duì) URL 字符串的路徑部分進(jìn)行 URL 編碼并返回編碼后的字符串。
- MapPath:返回與 Web 服務(wù)器上的指定虛擬路徑相對(duì)應(yīng)的物理文件路徑。 該方法經(jīng)常使用。將虛擬路徑轉(zhuǎn)換為服務(wù)器物理路徑。
context.Response.Write(context.Server.MapPath("/")); //輸出 C:\Users\Administrator\Desktop\WebApplication1\WebApplication1\ //該方法經(jīng)常用,將虛擬路徑轉(zhuǎn)換為物理路徑 context.Response.Write("<div style='background-color:red'>HtmlEncode測(cè)試</div>"); //如果不編碼,默認(rèn)就是會(huì)被瀏覽器解析的 context.Response.Write(context.Server.HtmlEncode("<div style='background-color:red'>HtmlEncode測(cè)試</div>")); //經(jīng)過編碼之后 原樣輸出
HttpUtility 類由 HttpServerUtility 類在內(nèi)部使用,HttpUtility 類包含無法從 Server訪問的編碼和解碼實(shí)用工具方法,如:ParseQueryString()方法等。
Response.Write("|Url:"+HttpUtility.UrlEncode("你好啊"));
若要對(duì) Web 應(yīng)用程序之外的值進(jìn)行編碼或解碼,請(qǐng)使用 WebUtility 類。
3、Server.Execute、Server.Transfer、Response.Redirect區(qū)別
- Server.Execute方法允許當(dāng)前的ASPX頁(yè)面執(zhí)行一個(gè)同一Web服務(wù)器上的指定ASPX頁(yè)面,當(dāng)指定的ASPX頁(yè)面執(zhí)行完畢,控制流程重新返回原頁(yè)面發(fā)出Server.Execute調(diào)用的位置。
- Server.Transfer的跳轉(zhuǎn)完全是在服務(wù)器端,瀏覽器根本不知道已經(jīng)跳轉(zhuǎn)了,因此路徑顯示的仍然是原路徑。
- Response.Redirect是客戶端發(fā)送請(qǐng)求到服務(wù)器,服務(wù)器執(zhí)行Response.Redirect之后,返回302,瀏覽器接收到請(qǐng)求后,再次發(fā)送一次請(qǐng)求到要跳轉(zhuǎn)的URL.
在網(wǎng)絡(luò)狀態(tài)較好的情況下,Redirect(url)方法效率最高!! 可重定向到同一臺(tái)或非同一臺(tái)服務(wù)器上的aspx或非aspx(html)資源。
Server.Transfer方法和Server.Execute方法最靈活!! 但只能轉(zhuǎn)到同一Application目錄下,也有可能導(dǎo)致不期望的結(jié)果發(fā)生。
Server.Execute方法占用資源最多.
七、Session屬性:每一個(gè)用戶的專有信息
Session屬性為當(dāng)前 HTTP 請(qǐng)求獲取 HttpSessionState 對(duì)象。
Session用來保存每一個(gè)用戶的專有信息。 HttpSessionState類通過HttpContext或Page對(duì)象的Session屬性訪問。一臺(tái)客戶機(jī)上多個(gè)瀏覽器窗口訪問只有一個(gè)Session。
Session的生存期是用戶持續(xù)請(qǐng)求時(shí)間加上一段時(shí)間(一般是20分鐘左右), Session超時(shí)或者被關(guān)閉將自動(dòng)釋放數(shù)據(jù)信息,由于用戶停止使用應(yīng)用程序之后它仍在內(nèi)存中存留一段時(shí)間,因此這種方法效率較低。
Session信息是保存在Web服務(wù)器內(nèi)存中的,保存數(shù)據(jù)量可大可小。
1、配置Session
在Web.config中的 <system.web> </system.web>之間添加
<sessionState mode="InProc"http://InProc:保存到內(nèi)存,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查詢字符串傳送會(huì)話ID。 timeout="20" />
其中timeout是過期時(shí)間,如20分鐘后超時(shí)。
2、操作Session:
//添加: Session["userName"] = "aaa"; //獲?。? if (Session["userName"] != null) { string str = Session["userName"].ToString(); } //清除某個(gè)Session Session["UserName"] = null; Session.Remove("UserName"); //清除全部Session Session.Clear();
八、User屬性
User的屬性提供對(duì)IPrincipal接口的屬性和方法的編程訪問。
這個(gè)屬性能讓我們?cè)L問各種信息,包括用戶是否已驗(yàn)證,用戶的類型,用戶名等等,我們還可以對(duì)該屬性的功能進(jìn)性擴(kuò)展,以實(shí)現(xiàn)我們的要求。
分配給HttpContext.User的對(duì)象必須實(shí)現(xiàn)IPrincipal接口,而Iprincipal定義的屬性之一是Identity,它必須實(shí)現(xiàn)Iidentity接口。
if (User.Identity.IsAuthenticated) { Page.Title = "Home page for " + User.Identity.Name; } else { Page.Title = "Home page for guest user."; }
到此這篇關(guān)于ASP.NET中HttpContext對(duì)象的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.Net頁(yè)面生命周期與Page_Load方法的工作原理介紹
這篇文章介紹了ASP.Net頁(yè)面生命周期與Page_Load方法的工作原理,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05.Net結(jié)構(gòu)型設(shè)計(jì)模式之適配器模式(Adapter)
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之適配器模式(Adapter),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05ASP.NET?Core?MVC路由(Routing)的用法
這篇文章介紹了ASP.NET?Core?MVC路由(Routing)的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04