web-dev-qa-db-fra.com

Accéder au contexte HttpContext actuel dans ASP.NET Core

J'ai besoin d'accéder à HttpContext actuel par une méthode statique ou un service public.

Avec ASP.NET MVC classique et System.Web, je voudrais simplement utiliser HttpContext.Current pour accéder au contexte de manière statique. Mais comment puis-je faire cela dans ASP.NET Core?

84
maxswitcher

HttpContext.Current n'existe plus dans ASP.NET Core, mais il existe un nouveau IHttpContextAccessor que vous pouvez injecter dans vos dépendances et utiliser pour récupérer la HttpContext actuelle:

public class MyComponent : IMyComponent
{
    private readonly IHttpContextAccessor _contextAccessor;

    public MyComponent(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public string GetDataFromSession()
    {
        return _contextAccessor.HttpContext.Session.GetString(*KEY*);
    }
}
103
Pinpoint

Juste pour ajouter aux autres réponses ...

Dans ASP.NET Core 2.1, il y a la méthode d'extension AddHttpContextAccessor , qui enregistrera la IHttpContxtAccessor avec la durée de vie correcte.

17
khellang

La manière la plus légitime que j'ai trouvée est d'injecter IHttpContextAccessor dans votre implémentation statique comme suit: 

public static class HttpHelper
{
     private static IHttpContextAccessor _accessor;
     public static void Configure(IHttpContextAccessor httpContextAccessor)
     {
          _accessor = httpContextAccessor;
     }

     public static HttpContext HttpContext => _accessor.HttpContext;
}

Ensuite, l’affectation de IHttpContextAccessor dans la configuration de démarrage devrait s’acquitter de cette tâche.

HttpHelper.Configure(app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());

Je suppose que vous devriez également avoir besoin d’enregistrer le service singleton:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
9
Jan

En démarrage

services.AddHttpContextAccessor();

Dans le contrôleur

public class HomeController : Controller
    {
        private readonly IHttpContextAccessor _context;

        public HomeController(IHttpContextAccessor context)
        {
            _context = context; 
        }
        public IActionResult Index()
        {
           var context = _context.HttpContext.Request.Headers.ToList();
           return View();
        }
   }
0
Diana Tereshko

Selon cet article: Accès à HttpContext en dehors des composants du framework dans ASP.NET Core

namespace System.Web
{
    public static class HttpContext
    {
        private static IHttpContextAccessor _contextAccessor;

        public static Microsoft.AspNetCore.Http.HttpContext Current => _contextAccessor.HttpContext;

        internal static void Configure(IHttpContextAccessor contextAccessor)
        {
            _contextAccessor = contextAccessor;
        }
    }
}

Ensuite:

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>();
        System.Web.HttpContext.Configure(httpContextAccessor);
        return app;
    }
}

Ensuite:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpContextAccessor();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseStaticHttpContext();
        app.UseMvc();
    }
}

Vous pouvez l'utiliser comme ceci:

using System.Web;

public class MyService
{
   public void DoWork()
   {
    var context = HttpContext.Current;
    // continue with context instance
   }
}
0
Jahan