欢迎光临
个人技术文档整理

如何在 .NET Core中获取HttpContext?

什么是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;
            }

    避免在多线程,事件总线,定时任务等中使用。(线程安全问题等)

赞(2)