ASP.NET?Core中HttpContext詳解與使用
“傳導(dǎo)體” HttpContext
要理解 HttpContext 是干嘛的,首先,看圖
圖一 內(nèi)網(wǎng)訪問程序
圖二 反向代理訪問程序
ASP.NET Core 程序中,Kestrel 是一個基于 libuv 的跨平臺ASP.NET Core web服務(wù)器。不清楚 Kerstrel 沒關(guān)系,以后慢慢了解。
我們可以理解成,外部訪問我們的程序,通過 Http 或者 Https 訪問,例如https://localhost:44337/Home/Index,需要通過一個網(wǎng)址,來尋向訪問特定的頁面。
訪問頁面時,會產(chǎn)生 Cookie、Seesion、提交表單、上傳數(shù)據(jù)、身份認證等,外部與應(yīng)用程序之間傳導(dǎo)的導(dǎo)體就是 HttpContext。
總之,客戶端跟 Web應(yīng)用程序交互 是通過 HttpContext 傳導(dǎo)的。
原理
ASP.NET Core 本質(zhì)是一個控制臺程序!ASP.NET Core程序并不直接監(jiān)聽請求,而是通過依賴 HTTP Server,來實現(xiàn)把各自請求轉(zhuǎn)發(fā)到應(yīng)用程序中。這個被轉(zhuǎn)發(fā)的請求相當(dāng)于我們?nèi)粘g覽網(wǎng)頁、上傳文件、提交表單等的網(wǎng)絡(luò)請求,這些請求會被包裝,然后組合到 HttpContext 中。
就好像顧客到餐廳吃飯
- 需要先點菜、提出服務(wù)要求
- 服務(wù)員把你的菜單、需求送到廚房
- 廚師在加工好食品
- 服務(wù)員再把食品遞給你
HttpContext 相當(dāng)于這個服務(wù)員,她在前、后傳遞信息。
操作 HttpContext 前期準(zhǔn)備
一般來說,我們主要寫好Web程序,而無需理會 數(shù)據(jù)是怎么傳導(dǎo)的。就好像兩臺電腦能夠發(fā)送資料,我們用不著知道他們是通過無線Wifi、光纖還是銅線電纜傳輸?shù)摹?/p>
當(dāng)有需要時,自然需要用~ 廢話少說,先簡單操作 HttpContext 了解下。后面接著解析這個對象。
如果你不需要練習(xí),請直接跳過這一節(jié)內(nèi)容。
- 打開 VS(2017)
- 新建項目
- ASP.NET Core Web 應(yīng)用程序
- Web應(yīng)用程序(模型視圖控制器)
- 打開 Startup.cs ,在 ConfigureServices 中,加上
- 打開HomeController.cs ,在頂部using Microsoft.AspNetCore.Http; 把 HomeController 類替換成以下代碼
public class HomeController : Controller { private IHttpContextAccessor _accessor; public HomeController(IHttpContextAccessor accessor) { _accessor = accessor; } [HttpGet] public IActionResult Index(int? id) { var httpcontext = _accessor.HttpContext; return View(httpcontext); } }
- 打開Views/Home目錄,刪除 Index.cshtml 外的其它視圖
- 把 Index.cshtml 的代碼改成
@model Microsoft.AspNetCore.Http.HttpContext @{ Layout = null; }
到這里,準(zhǔn)備已經(jīng)完成。
以上代碼的作用是把 HttpContext 對象 傳遞到 視圖 中,直接在視圖中使用。這樣我們在理解時,只需在視圖測試即可。
HttpContext 類型的屬性和方法
在 ASP.NET Core 中,系統(tǒng)為每一個請求分配一個線程,HttpContext 針對的,就是一個線程。所以它的類、方法、屬性等,都是針對當(dāng)前請求起作用。
Authentication | 這個已經(jīng)用不到了,這里只是列一下表。 用于身份認證(ASP.NET中用到),官方不建議在ASP.NT Core中使用。替代方案 Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions |
Connection | 獲取有關(guān)此請求的基礎(chǔ)連接的信息 |
Features | 獲取此請求上可用的服務(wù)器和中間件提供的HTTP特性的集合 |
Items | 獲取或設(shè)置可用于在該請求范圍內(nèi)共享數(shù)據(jù)的鍵/值集合 |
Request | 請求 |
RequestAborted | 通知此請求基礎(chǔ)的連接何時中止,因此請求操作應(yīng)取消 |
RequestServices | 獲取或設(shè)置 IServiceProvider 集合,提供訪問的請求的服務(wù)容器 |
Response | 響應(yīng) |
Session | 獲取或設(shè)置用于管理此請求的用戶會話數(shù)據(jù)的對象 |
TraceIdentifier | 獲取或設(shè)置用于在跟蹤日志中表示此請求的唯一標(biāo)識符 |
User | 獲取或設(shè)置此請求的用戶 |
WebSockets | 獲取一個對象,該對象管理此請求的WebSu套連接的建立 |
Item、Session、Response 等對象都是需要經(jīng)常使用到的,下面筆者會詳細實踐。
HttpContext 對象實踐與測試
Request
用于獲取用戶請求的對象,瀏覽器向Web程序提交表單、訪問的URL、URL中包含的查詢字符串、報文請求頭等等。
Body | 獲取或設(shè)置 RequestBody 流 |
ContentLength | 獲取或設(shè)置 Content-Length 頭 |
ContentType | 獲取或設(shè)置Content-Type 頭 |
Cookies | 獲取或設(shè)置 Cookies |
Form | 獲取或設(shè)置 表單內(nèi)容 |
HasFormContentType | Checks the Content-Type header for form types. |
Headers | Gets the request headers. |
Host | 獲取或設(shè)置主機頭??梢园ǘ丝?/p> |
HttpContext | 獲取或設(shè)置請求上下文 |
IsHttps | 檢測當(dāng)前是否HTTPS連接 |
Method | 獲取或設(shè)置HTTP方法 |
Path | 獲取或設(shè)置當(dāng)前請求的路徑,即URL |
PathBase | 獲取或設(shè)置 RequestPathBase,就是URL前面那一段,如https://docs.microsoft.com |
Protocol | Gets or sets the RequestProtocol. |
Query | 查詢字符串的集合 |
QueryString | 獲取或設(shè)置用于在Request.Query中創(chuàng)建查詢集合的原始查詢字符串 |
Scheme | 獲取或設(shè)置HTTP請求方案 |
試一試
打開 Index.Cshtml ,把以下代碼加上去
(為了看得清楚一點,我加了表格)
<table> <tr> <td>RequestBody流</td> <td> @Model.Request.Body</td> </tr> <tr> <td>Content-Length頭</td> <td>@Model.Request.ContentLength</td> </tr> <tr> <td>Content-Type頭</td> <td> @Model.Request.ContentType</td> <tr> <td>Cookies </td> <td>@Model.Request.Cookies</td> </tr> <tr> <td>IsHttps</td> <td>@Model.Request.IsHttps</td> </tr> <tr> <td>Host </td> <td>@Model.Request.Host</td> </tr> </table>
運行Web程序,結(jié)果如下
在瀏覽器 F12 后,可以看到控制臺的內(nèi)容。請查看 下圖的 1、3部分
Request 的其它使用方法,就不再贅述,你可以在視圖中@Model.Request. 加上需要測試的屬性即可。
推薦別人關(guān)于 Request 的文章http://www.dbjr.com.cn/article/234396.htm
Response
Request 是 客戶端向 Web 發(fā)送請求,而 Response 則是 Web 響應(yīng) 客戶端 的請求。這里筆者就不全部翻譯了
使用Response可以直接影響服務(wù)器響應(yīng),設(shè)置響應(yīng)內(nèi)容、響應(yīng)類型(發(fā)送網(wǎng)頁、文件、圖片等)、視圖響應(yīng)前重定向。
Response 應(yīng)該在控制器中使用。具體使用方法筆者這里就不贅述。
Body | 獲取或設(shè)置響應(yīng)體流 |
ContentLength | Gets or sets the value for the |
ContentType | 獲取或設(shè)置內(nèi)容類型響應(yīng)標(biāo)頭的值 |
Cookies | 獲取一個對象,該對象可用于管理此響應(yīng)的Cookie |
HasStarted | Gets a value indicating whether response headers have been sent to the client. |
Headers | Gets the response headers. |
HttpContext | Gets the HttpContext for this response. |
StatusCode | Gets or sets the HTTP response code. |
Response 的方法
OnCompleted(Func<Task>) | 在響應(yīng)已發(fā)送到客戶端之后添加要調(diào)用的委托 |
OnCompleted(Func<Object,Task>, Object) | 響應(yīng)已發(fā)送到客戶端之后添加要調(diào)用的委托 |
OnStarting(Func<Task>) | 在響應(yīng)頭將被發(fā)送到客戶端之前添加要調(diào)用的委托 |
OnStarting(Func<Object,Task>, Object) | 在響應(yīng)頭將被發(fā)送到客戶端之前添加要調(diào)用的委托 |
Redirect(String) | 向客戶端返回一個臨時重定向響應(yīng)(HTTP 302) |
Redirect(String, Boolean) | 向客戶端返回重定向響應(yīng)(HTTP 301或HTTP 302) |
RegisterForDispose(IDisposable) | 處置(不可分)在請求完成處理后,注冊主機處理的對象 |
Response 拓展方法
GetTypedHeaders(HttpResponse) | |
WriteAsync(HttpResponse, String, Encoding, CancellationToken) | 取消令牌使用給定的編碼將給定文本寫入響應(yīng)體 |
WriteAsync(HttpResponse, String, CancellationToken) | 將給定文本寫入響應(yīng)體。UTF-8編碼將被使用 |
Clear(HttpResponse) | |
SendFileAsync(HttpResponse, IFileInfo, Int64, Nullable<Int64>, CancellationToken) | 使用Sendfile 擴展發(fā)送給定的文件 |
SendFileAsync(HttpResponse, IFileInfo, CancellationToken) | Sends the given file using the SendFile extension. |
SendFileAsync(HttpResponse, String, Int64, Nullable<Int64>, CancellationToken) | Sends the given file using the SendFile extension. |
SendFileAsync(HttpResponse, String, CancellationToken) | Sends the given file using the SendFile extension. |
請參考下圖的第 2 部分
Item
如果你使用過 ViewData,就不難理解 HttpContext.Item
HttpContext.Item 是一個字典集合類型,具體類型為 IDictionary<TModel,TModel>。它的使用方法像 ViewData。(不要跟我說說你不知道 ViewBag、ViewData 是什么~)
打開 Index.Cshtml ,用下面代碼復(fù)制替換
@model Microsoft.AspNetCore.Http.HttpContext @{ Layout = null; } @{ List<string> i = new List<string>(); i.Add("a"); i.Add("b"); i.Add("c"); i.Add("d"); i.Add("e"); i.Add("f"); i.Add("g"); i.Add("h"); i.Add("i"); Model.Items["Test"] = i; /* Model.Items 是字典類型 這里設(shè)置 鍵 Test 值 i ,它的值是 List<string> 類型 */ foreach(var item in Model.Items["Test"] as List<string>) //字典類型,必須先用 as 轉(zhuǎn)為對應(yīng)類型 { <br> @item } }
結(jié)果
可以用HttpContext.Item 來存儲當(dāng)前請求的意向有用的數(shù)據(jù)。
HttpContext 的其它方法使用這里不再贅述,需要注意的是,HttpContext 是針對一個請求的而產(chǎn)生的。
到此這篇關(guān)于ASP.NET Core中HttpContext詳解與使用的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
WPF框架Prism中導(dǎo)航Navigation用法介紹
這篇文章介紹了WPF框架Prism中導(dǎo)航Navigation的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02.Net結(jié)構(gòu)型設(shè)計模式之外觀模式(Facade)
這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計模式之外觀模式(Facade),文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05SqlConnection.ConnectionString相關(guān)關(guān)鍵字
SqlConnection.ConnectionString相關(guān)關(guān)鍵字...2007-01-01一步步打造漂亮的新聞列表(無刷新分頁、內(nèi)容預(yù)覽)第一步
新聞列表是信息管理系統(tǒng)中最常見的,也是最簡單的,一些簡單的新聞列表就是一個table,然后里面循環(huán)寫入數(shù)據(jù)2010-07-07