在ASP.NET Core中怎么使用HttpContext.Current

一、前言

最近学习使用ASP.NET Core,想获取当前请求的一些信息,例如一些用户信息,session,cookie等,但发现ASP.NET Core 中HttpContext.Current是不能直接点出来的。当然我们也可以通过在Controller中访问HttpContext,但是某些情况下,这样使用起来还是不如HttpContext.Current方便。

二、自己模拟一个HttpContext.Current

利用ASP.NET Core的依赖注入容器系统,通过请求获取IHttpContextAccessor接口,我们拥有模拟使用HttpContext.Current这样API的可能性。但是因为IHttpContextAccessor接口默认不是由依赖注入进行实例管理的。我们先要将它注册到ServiceCollection中,所以来到Startup.cs这个文件中,找到以下配置方法,添加以下代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Other code...
}




然后写一个自己的HttpContext,建议公共引用的文件夹,新建一个类,代码如下:

public static class HttpContext
    {
        public static IServiceCollection serviceCollection;

        public static Microsoft.AspNetCore.Http.HttpContext Current
        {
            get
            {
                object factory = serviceCollection.BuildServiceProvider().GetService(typeof(IHttpContextAccessor));
                Microsoft.AspNetCore.Http.HttpContext context = ((HttpContextAccessor)factory).HttpContext;
                return context;
            }
        }

    }














然后我们回到Startup类中,因为上面HttpContext类中的public static IServiceCollection serviceCollection是没有被赋值的,所以要给其赋值,加上以下代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    CoreTest.Common.HttpContext.serviceCollection = services; 
    //CoreTest.Common是命名空间

    // Other code...
}






这样我们就可以像在以前ASP.NET中一样,在ASP.NET Core中也可以使用CoreTest.Common.HttpContext.Current了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章