在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了。


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