asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用

分享一篇文章,關於asp.net core中httpcontext的拓展。web

如今,試圖圍繞HttpContext.Current構建你的代碼真的不是一個好主意,可是我想若是你正在遷移一個企業類型的應用程序,那麼不少HttpContext.Current會圍繞這個業務邏輯,它可能會提供一些暫時的緩解移植應用程序的條款。另外,在過去我已經寫了一些我不必定認爲是好主意的事情。api

咱們現代的HttpContext.Current將依賴於從IHttpContextAccessor解析上下文,而且可能以下所示:微信

namespace System.Web
{
    public static class HttpContext
    {
        private static IHttpContextAccessor _contextAccessor;


        public static Microsoft.AspNetCore.Http.HttpContext Current => _contextAccessor.HttpContext;


        internal static void Configure(IHttpContextAccessor contextAccessor)
        {
            _contextAccessor = contextAccessor;
        }
    }
}

  

請注意,咱們甚至將它放置在System.Web命名空間中,以便您進行任何潛在的遷移更容易一些。session

咱們只須要在處理流水線中儘量早地將代碼添加到Configure中,並傳入IHttpContextAccessor。這能夠經過兩種擴展方法來實現:app

public static class StaticHttpContextExtensions
    {
        public static void AddHttpContextAccessor(this IServiceCollection services)
        {
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        }


        public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
        {
            var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
            Common.HttpContext.Configure(httpContextAccessor);
            return app;
        }

  

第一個將在啓動時ConfigureServices中調用,並在DI中註冊訪問器。咱們已經肯定,這是默認IHttpContextFactory正確分享其HttpContext實例所必需的。asp.net

第二個將在啓動時Configure中調用,而且它將確保咱們的自定義HttpContext.Current賦予IHttpContextAccessor以使其能夠正常工做。ui

就是這樣 這是個人Startup類,爲靜態HttpContext.Current設置表。this

public class Startup
    {
        public void ConfigureServices(IServiceCollectionservices)
        {
            services.AddHttpContextAccessor();
        }
 
        public void Configure(IApplicationBuilderapp)
        {
            app.UseStaticHttpContext();
            app.UseMvc();
        }
    }

例子:spa

public class MyService
{
    public void DoWork()
    {
        var context=HttpContext.Current;
        // continue with context instance
    }
}

好了這篇文章也解了我好久的惑,今天就分享到這裏!.net


歡迎你們關注我都個人微信 公衆號,公衆號漲粉絲人數,就是大家對個人喜好程度!

 

相關文章
相關標籤/搜索