1. 程式人生 > 程式設計 >ASP.NET Core中HttpContext詳解與使用

ASP.NET Core中HttpContext詳解與使用

“傳導體” HttpContext

要理解 HttpContext 是幹嘛的,首先,看圖

圖一 內網訪問程式

ASP.NETCore中HttpContext詳解與使用

圖二 反向代理訪問程式

ASP.NETCore中HttpContext詳解與使用

ASP.NET Core 程式中,Kestrel 是一個基於 libuv 的跨平臺ASP.NET Core web伺服器。不清楚 Kerstrel 沒關係,以後慢慢了解。

我們可以理解成,外部訪問我們的程式,通過 Http 或者 Https 訪問,例如https://localhost:44337/Home/Index,需要通過一個網址,來尋向訪問特定的頁面。

訪問頁面時,會產生 Cookie、Seesion、提交表單、上傳資料、身份認證等,外部與應用程式之間傳導的導體就是 HttpContext。

總之,客戶端跟 Web應用程式互動 是通過 HttpContext 傳導的。

原理

ASP.NET Core 本質是一個控制檯程式!ASP.NET Core程式並不直接監聽請求,而是通過依賴 HTTP Server,來實現把各自請求轉發到應用程式中。這個被轉發的請求相當於我們日常瀏覽、上傳檔案、提交表單等的網路請求,這些請求會被包裝,然後組合到 HttpConhttp://www.cppcns.comtext 中。

就好像顧客到餐廳吃飯

  • 需要先點菜、提出服務要求
  • 服務員把你的選單、需求送到廚房
  • 廚師在加工好食品
  • 服務員再把食品遞給你

HttpContext 相當於這個服務員,她在前、後傳遞資訊。

操作 HttpContext 前期準備

一般來說,我們主要寫好Web程式,而無需理會 資料是怎麼傳導的。就好像兩臺電腦能夠傳送資料,我們用不著知道他們是通過無線Wifi、光纖還是銅線電纜傳輸的。

當有需要時,自然需要用~ 廢話少說,先簡單操作 HttpContext 瞭解下。後面接著解析這個物件。

如果你不需要練習,請直接跳過這一節內容。

  • 開啟 VS(2017)
  • 新建專案
  • ASP.NET Core Web應用程式
  • Web應用程式(模型檢視www.cppcns.com控制器)
  • 開啟Startup.cs,在ConfigureServices中,加上

ASP.NETCore中HttpContext詳解與使用

  • 開啟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;
}

到這裡,準備已經完成。

以上程式碼的作用是把 HttpContext 物件 傳遞到 檢視 中,直接在檢視中使用。這樣我們在理解時,只需在檢視測試即可。

HttpContext 型別的屬性和方法

在 ASP.NET Core 中,系統為每一個請求分配一個執行緒,HttpContext 針對的,就是一個執行緒。所以它的類、方法、屬性等,都是針對當前請求起作用。

Authentication

這個已經用不到了,這裡只是列一下表。

用於身份認證(ASP.NET中用到),官方不建議在ASP.NT Core中使用。替代方案 Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions

Connection

獲取有關此請求的基礎連線的資訊

Features

獲取此請求上可用的伺服器和中介軟體提供的HTTP特性的集合

Items

獲取或設定可用於在該請求範圍內共享資料的鍵/值集合

Request

請求

RequestAborted

通知此請求基礎的連線何時中止,因此請求操作應取消

RequestServices

獲取或設定 IServiceProvider 集合,提供訪問的請求的服務容器

Response

響應

Session

獲取或設定用於管理此請求的使用者會話資料的物件

TraceIdentifier

獲取或設定用於在跟蹤日誌中表示此請求的唯一識別符號

User

獲取或設定此請求的使用者

WebSockets

獲取一個物件,該物件管理此請求的WebSu套連線的建立

Item、Session、Response 等物件都是需要經常使用到的,下面筆者會詳細實踐。

HttpContext 物件實踐與測試

Request

用於獲取使用者請求的物件,瀏覽器向Web程式提交表單、訪問的URL、URL中包含的查詢字串、報文請求頭等等。

Body

獲取或設定RequestBody 流

ContentLength

獲取或設定 Content-Length頭

ContentType

獲取或設定Content-Type 頭

Cookies

獲取或設定 Cookies

Form

獲取或設定 表單內容

HasFormContentType

Checks the Content-Type header for form types.

Headers

Gets the request headers.

Host

獲取或設定主機頭。可以包括埠

HttpContext

獲取或設定請求上下文

IsHttps

檢測當前是否HTTPS連線

Method

獲取或設定HTTP方法

Path

獲取或設定當前請求的路徑,即URL

PathBase

獲取或設定 RequestPathBase,就是URL前面那一段,如https://docs.microsoft.com

Protocol

Gets or sets the RequestProtocol.

Query

查詢字串的集合

QueryString

獲取或設定用於在Request.Query中建立查詢集合的原始查詢字串

Scheme

獲取或設定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>
 www.cppcns.com       <td>IsHttps</td>
        <td>@Model.Request.IsHttps</td>
        </tr>
    <tr>
        <td>Host </td>
        <td>@Model.Request.Host</td>
    </tr>

</table>

執行Web程式,結果如下

ASP.NETCore中HttpContext詳解與使用

在瀏覽器 F12 後,可以看到控制檯的內容。請檢視 下圖的 1、3部分

ASP.NETCore中HttpContext詳解與使用

Request 的其它使用方法,就不再贅述,你可以在檢視中@Model.Request. 加上需要測試的屬性即可。

推薦別人關於 Request 的文章https://www.jb51.net/article/234396.htm

Response

Request 是 客戶端向 Web 傳送請求,而 Response 則是 Web 響應 客戶端 的請求。這裡筆者就不全部翻譯了

使用Response可以直接影響伺服器響應,設定響應內容、響應型別(傳送網頁、檔案、圖片等)、檢視響應前重定向。

Response 應該在控制器中使用。具體使用方法筆者這裡就不贅述。

Body

獲取或設定響應體流

ContentLength

Gets or sets the value for theContent-Typeresponse header.

ContentType

獲取或設定內容型別響應標頭的值

Cookies

獲取一個物件,該物件可用於管理此響應的Cookie

HasStarted

Gets a value indicating whether response heaVaSbOBipders have been sent to the client.

Headers

Gets the response headers.

HttpContext

Gets theHttpContextfor this response.

StatusCode

Gets or sets the HTTP response code.

Response 的方法

OnCompleted(Func<Task>)

在響應已傳送到客戶端之後新增要呼叫的委託

OnCompleted(Func<Object,Task>,Object)

響應已傳送到客戶端之後新增要呼叫的委託

OnStarting(Func<Task>)

在響應頭將被髮送到客戶端之前新增要呼叫的委託

OnStarting(Func<Object,Object)

在響應頭將被髮送到客戶端之前新增要呼叫的委託

Redirect(String)

向客戶端返回一個臨時重定向響應(HTTP 302)

Redirect(String,Boolean)

向客戶端返回重定向響應(HTTP 301或HTTP 302)

RegisterForDispose(IDisposable)

處置(不可分)在請求完成處理後,註冊主機處理的物件

Response 拓展方法

GetTypedHeaders(HttpResponse)
WriteAsync(HttpResponse,String,Encoding,CancellationToken)

取消令牌使用給定的編碼將給定文字寫入響應體

WriteAsync(HttpResponse,CancellationToken)

將給定文字寫入響應體。UTF-8編碼將被使用

Clear(HttpResponse)
SendFileAsync(HttpResponse,IFileInfo,Int64,Nullable<Int64>,CancellationToken)

使用Sendfile 擴充套件傳送給定的檔案

SendFileAsync(HttpResponse,CancellationToken)

Sends the given file using the SendFile extension.

SendFileAsync(HttpResponse,CancellationToken)

Sends the given file using the SendFile extension.

請參考下圖的第 2 部分

ASP.NETCore中HttpContext詳解與使用

Item

如果你使用過 ViewData,就不難理解 HttpContext.Item

HttpContext.Item 是一個字典集合型別,具體型別為 IDictionary<TModel,TModel>。它的使用方法像 ViewData。(不要跟我說說你不知道 ViewBag、ViewData 是什麼~)

開啟 Index.Cshtml ,用下面程式碼複製替換

@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.ItemsVaSbOBip 是字典型別
        這裡設定 鍵 Test
                 值 i,它的值是 List<string> 型別
    */

foreach(var item in Model.Items["Test"] as List<string>) //字典型別,必須先用 as 轉為對應型別
{
    <br> @item
    
}
}

結果

ASP.NETCore中HttpContext詳解與使用

可以用HttpContext.Item 來儲存當前請求的意向有用的資料。

HttpContext 的其它方法使用這裡不再贅述,需要注意的是,HttpContext 是針對一個請求的而產生的。

到此這篇關於ASP.NET Core中HttpContext詳解與使用的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援我們。