什么是HttpContext?
它保存有关Http请求的当前信息,包含诸如授权、身份验证、请求、响应、会话、项目、用户、formOptions等信息。每个HTTP请求都会使用当前信息创建HttpContext的新对象。
关于 HttpContext
- 在
ASP.NET
的时代,我们通常通过HttpContext
全局静态类获取请求上下文, - 在
ASP.NET Core
中,HttpContext
是一个非静态的抽象类,无法手动创建,也无法通过静态获取。ControllerBase
派生类中使用- 微软也提供了注入
IHttpContextAccessor
方式获取
1、获取 HttpContext(
在 ControllerBase
派生类中)
[HttpGet]
public string Get1()
{
var ip = HttpContext.Connection.RemoteIpAddress.ToString();
return ip;
}
2、获取 HttpContext(
注入 IHttpContextAccessor
)
- 在 Startup.cs 中注册服务
services.AddHttpContextAccessor();//注册 HttpContextAccessor 服务
- 构造函数注入 或 参数注入方式 [FromServices]
private readonly IHttpContextAccessor _httpContextAccessor; //构造函数注入 public HttpContextController(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; }
//参数注入方式 [FromServices] [HttpGet] public string Get4([FromServices] IHttpContextAccessor httpContextAccessor) { var ip = httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); return ip; }
3、获取 HttpContext(
注入 IHttpContextAccessor+AppHttpContext.css静态类)
- AppHttpContext.css 公共静态类
public static class AppHttpContext { private static IHttpContextAccessor _httpContextAccessor; public static void Configure(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public static HttpContext HttpContext { get { if (_httpContextAccessor == null) { throw new InvalidOperationException("尚未配置IHttpContextAccessor"); } return _httpContextAccessor.HttpContext; } } }
- Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddHttpContextAccessor();//注册 HttpContextAccessor 服务,源码为:services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>(); AppHttpContext.Configure(httpContextAccessor); }
-
//AppHttpContext 静态类也提供了 AppHttpContext.HttpContext 获取 HttpContext 对象。 [HttpGet] public string Get2() { var ip = AppHttpContext.HttpContext.Connection.RemoteIpAddress.ToString(); return ip; }
避免在多线程,事件总线,定时任务等中使用。(线程安全问题等)