在ASP.NET Core中要如何使用HttpContext呢,下面就來具體學習ASP.NET Core HttpContext。
注入HttpContextAccessor
ASP.NET Core中提供了一個IHttpContextAccessor接口,HttpContextAccessor 默認實現了它簡化了訪問HttpContext。
它必須在程序啟動時在IServicesCollection中注冊,這樣在程序中就能獲取到HttpContextAccessor,並用來訪問HttpContext。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
獲取HttpContextAccessor
下面來實際做一個操作,獲取 HttpContextAccessor。
在HomeController 加入如下代碼:
public class HomeController : Controller
{
private IHttpContextAccessor _accessor;
public HomeController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public IActionResult Index()
{
var httpcontext = _accessor.HttpContext;
return View();
}
}
這樣就能獲取到 HttpContext。上面也說到,必須在程序啟動時注入才能獲取到HttpContextAccessor。
實現HttpContext.Current
大家在ASP.NET 中大量用 HttpContext.Current獲取HttpContext ,現在ASP.NET Core已經不這么做了。
不過如果你還是想用靜態 HttpContext.Current ,降低遷移舊程序的成本,還是可以實現的。
新建一個靜態 HttpContext 類
public static class HttpContext
{
private static IHttpContextAccessor _accessor;
public static Microsoft.AspNetCore.Http.HttpContext Current => _accessor.HttpContext;
internal static void Configure(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
}
然后接着再添加一個擴展類。
public static class StaticHttpContextExtensions
{
public static void AddHttpContextAccessor(this IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
{
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
HttpContext.Configure(httpContextAccessor);
return app;
}
}
接着就可以在Startup 類中進行調用。
默認情況下如果在MVC項目中直接調用 UseStaticHttpContext() 即可。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseStaticHttpContext();
在沒有注入 HttpContextAccessor的項目中,還需在ConfigureServices 方法中調用
services.AddHttpContextAccessor();
然后就可以在其他地方使用HttpContext.Current。
public IActionResult Index()
{
var statichttpcontext = HttpContextDemo.HttpContext.Current;
return View();
}
這里演示的是在Controller 中調用,其實更多的是在其他地方調用,如中間件及一些自己寫的Service。
Controller 中其實可以直接使用HttpContext,ControllerBase類中有一個HttpContext 屬性。
