ASP.NET Core開發之HttpContext

ASP.NET Core中的HttpContext開發,在ASP.NET開發中咱們老是會常常用到HttpContext。app

那麼在ASP.NET Core中要如何使用HttpContext呢,下面就來具體學習ASP.NET Core HttpContext。學習

注入HttpContextAccessor

ASP.NET Core中提供了一個IHttpContextAccessor接口,HttpContextAccessor 默認實現了它簡化了訪問HttpContext。ui

它必須在程序啓動時在IServicesCollection中註冊,這樣在程序中就能獲取到HttpContextAccessor,並用來訪問HttpContext。this

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

獲取HttpContextAccessor

下面來實際作一個操做,獲取 HttpContextAccessor。spa

新建一個ASP.NET Core Web 應用程序,選擇Web 應用程序。 身份驗證勾選爲不進行身份驗證。code

而後在HomeController 加入以下代碼:中間件

public class HomeController : Controller
    {
        private IHttpContextAccessor _accessor;
        public HomeController(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }
        public IActionResult Index()
        {
            var httpcontext = _accessor.HttpContext;
            return View();
        }
    }

這樣就能獲取到 HttpContext對象

public IActionResut Index()
{
   var httpConetext = _accessor.HttpContext;
   return View();  
}

運行之後就能獲取到 HttpContext 對象。上面也說到,必須在程序啓動時注入才能獲取到HttpContextAccessor。blog

那麼新建的程序是在哪注入的呢。接口

這裏就是在 

public void ConfigureServices(IServiceCollection services)
{
   // Add framework services.
   services.AddMvc();
}

services.AddMvc() 中注入。

實現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 屬性。

相關文章
相關標籤/搜索