1. 程式人生 > >ASP.NET Core [3]:進入HttpContext的世界(筆記)

ASP.NET Core [3]:進入HttpContext的世界(筆記)

每一個 ask actor n) public feature ado 協議 ddl

參考:http://www.cnblogs.com/RainingNight/p/httpcontext-in-asp-net-core.html

HttpContext是ASP.NET中的核心對象,每一個請求都會創建一個對應的HttpContext對象,我們的應用程序便是通過HttpContext對象來獲取請求信息,最終生成響應,寫回到HttpContext中,完成一次請求處理。

1、 WebHost 在啟動 IServer 時,會傳入一個 IHttpApplication<TContext> 類型的對象,Server 負責對請求的監聽,在接收到請求時,會調用該對象的 ProcessRequestAsync 方法將請求轉交給我們的應用程序。

2、 首先使用 IHttpContextFactory 來創建 HttpContext 實例,然後在 ProcessRequestAsync 方法中調用上一章介紹的 RequestDelegate,由此進入到我們的應用程序當中。IHttpApplication<TContext> 的默認實現為 HostingApplication ,有如下定義:

public class HostingApplication : IHttpApplication<HostingApplication.Context>
{
    private readonly RequestDelegate _application;
    
private readonly IHttpContextFactory _httpContextFactory;
//創建httpcontext實例
public Context CreateContext(IFeatureCollection contextFeatures) { var context = new Context(); var httpContext = _httpContextFactory.Create(contextFeatures); _diagnostics.BeginRequest(httpContext,
ref context); context.HttpContext = httpContext; return context; // } //調用 ProcessRequestAsync 方法將請求轉交給我們的應用程序。 public Task ProcessRequestAsync(Context context) { return _application(context.HttpContext); } public void DisposeContext(Context context, Exception exception) { var httpContext = context.HttpContext; _diagnostics.RequestEnd(httpContext, exception, context); _httpContextFactory.Dispose(httpContext); _diagnostics.ContextDisposed(context); } }

HttpContext

HttpContext 對象我們應該都很熟悉了,它用來表示一個抽象的HTTP上下文,而HttpContext對象的核心又體現在用於描述請求的Request和描述響應的Response屬性上。

HttpRequest

HttpRequest 可以用來獲取到描述當前請求的各種相關信息,比如請求的協議(HTTP或者HTTPS)、HTTP方法、地址,以及該請求的請求頭,請求體等:HttpRequest是一個抽象類,它的默認實現是DefaultHttpRequest:

HttpResponse

在了解了表示請求的抽象類 HttpRequest 之後,我們再來認識一下與它對應的,用來描述響應的 HttpResponse 類型:HttpResponse也是一個抽象類,我們使用它來輸出對請求的響應,如設置HTTP狀態碼,Cookies,HTTP響應報文頭,響應主體等,以及提供了一些將響應發送到客戶端時的相關事件。

IHttpContextAccessor

ASP.NET Core 中一切皆註入,更加推薦使用註入的方式來獲取實例,而非使用靜態變量。因此,ASP.NET Core 提供了一個 IHttpContextAccessor 接口,用來統一獲取當前請求的 HttpContext 實例的方式:

public interface IHttpContextAccessor
{
    HttpContext HttpContext { get; set; }
}

  ASP.NET Core 默認並沒有註入 IHttpContextAccessor 對象,如果我們想在應用程序中使用它,則需要手動來註冊:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

ASP.NET Core 使用 AsyncLocal<T> 來保證線程內的唯一實例。

ASP.NET Core [3]:進入HttpContext的世界(筆記)