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