ASP.NET Core-HttpContextの使い方

3006 ワード

ASP.NET CoreでHttpContextをどのように使うか、具体的にASP.NET Core HttpContext.

注入HttpContextAccessor


ASP.NET CoreにはIHttpContextAccessorインタフェースが用意されており、HttpContextAccessorのデフォルトでは、HttpContextへのアクセスが簡素化されています.
プログラムの起動時にIServicesCollectionに登録する必要があります.これにより、プログラムでHttpContextAccessorを取得し、HttpContextにアクセスできます.
services.AddSingleton();

 

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();
        }

        public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
        {
            var httpContextAccessor = app.ApplicationServices.GetRequiredService();
            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で呼び出すことを示しますが、ミドルウェアや自分で書いたサービスなど、他の場所で呼び出すことが多いです.
Controllerでは、HttpContextを直接使用できます.ControllerBaseクラスにはHttpContextプロパティがあります.