在Controller中获取HttpContext
可以直接使用HttpContext来获取当前的HttpContext,例如:
[HttpGet]
public void Test()
{
Console.WriteLine(HttpContext.GetHashCode());
}
在自定义的服务中获取HttpContext
在自定义的服务中获取HttpContext可以借助IHttpContextAccessor,通过它的HttpContext属性获取到一个HttpContext实例
例如有一个自定义的服务OrderService
namespace PureAPIProject
{
public class OrderService : IOrderService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public OrderService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void Show()
{
Console.WriteLine(_httpContextAccessor.HttpContext!.GetHashCode());
}
}
}
它的Show方法很简单,就是输出了一下HttpContext的HashCode
要想在OrderService中注入IHttpContextAccessor,当然需要在容器中事先注册好IHttpContextAccessor服务
services.AddHttpContextAccessor();
services.AddScoped<IOrderService, OrderService>();
然后就可以在Controller中验证OrderService中的HttpContext和Controller中直接获取的HttpContext是不是同一个HttpContext
[HttpGet]
public void Test()
{
Console.WriteLine(HttpContext.GetHashCode());
_orderService.Show();
}
访问该Action,发现二者输出的hashcode是一样的,证明确实在自定义的服务中获取到了HttpContext
参考:
微软官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0
ASP.NET Core管道详解[2]: HttpContext本质论:https://www.cnblogs.com/artech/p/inside-pipeline-02.html