1. 程式人生 > 實用技巧 >ASP.NET Core開發之HttpContext

ASP.NET Core開發之HttpContext

ASP.NET Core中的HttpContext開發,在ASP.NET開發中我們總是會經常用到HttpContext。

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

注入HttpContextAccessor

ASP.NET Core中提供了一個IHttpContextAccessor介面,HttpContextAccessor預設實現了它簡化了訪問HttpContext。

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

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

獲取HttpContextAccessor

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

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

然後在HomeController 加入如下程式碼:

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

這樣就能獲取到HttpContext

執行以後就能獲取到HttpContext 物件。上面也說到,必須在程式啟動時注入才能獲取到HttpContextAccessor。

那麼新建的程式是在哪注入的呢。

這裡就是在

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

如果報錯,看一下這個地方