一、前言
最近學習使用ASP.NET Core,想獲取當前請求的一些信息,例如一些用戶信息,session,cookie等,但發現ASP.NET Core 中HttpContext.Current
是不能直接點出來的。當然我們也可以通過在Controller中訪問HttpContext,但是某些情況下,這樣使用起來還是不如HttpContext.Current
方便。
二、自己模擬一個HttpContext.Current
利用ASP.NET Core的依賴注入容器系統,通過請求獲取IHttpContextAccessor
接口,我們擁有模擬使用HttpContext.Current
這樣API的可能性。但是因爲IHttpContextAccessor
接口默認不是由依賴注入進行實例管理的。我們先要將它註冊到ServiceCollection
中,所以來到Startup.cs這個文件中,找到以下配置方法,添加以下代碼:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Other code...
}
然後寫一個自己的HttpContext,建議公共引用的文件夾,新建一個類,代碼如下:
public static class HttpContext
{
public static IServiceCollection serviceCollection;
public static Microsoft.AspNetCore.Http.HttpContext Current
{
get
{
object factory = serviceCollection.BuildServiceProvider().GetService(typeof(IHttpContextAccessor));
Microsoft.AspNetCore.Http.HttpContext context = ((HttpContextAccessor)factory).HttpContext;
return context;
}
}
}
然後我們回到Startup類中,因爲上面HttpContext類中的public static IServiceCollection serviceCollection是沒有被賦值的,所以要給其賦值,加上以下代碼:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
CoreTest.Common.HttpContext.serviceCollection = services;
//CoreTest.Common是命名空間
// Other code...
}
這樣我們就可以像在以前ASP.NET中一樣,在ASP.NET Core中也可以使用CoreTest.Common.HttpContext.Current了。