asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用


我們現代的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命名空間中,以便您進行任何潛在的遷移更容易一些。

我們只需要在處理流水線中盡可能早地將代碼添加到Configure中,並傳入IHttpContextAccessor。這可以通過兩種擴展方法來實現:

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實例所必需的。

第二個將在啟動時從Configure中調用,並且它將確保我們的自定義HttpContext.Current被賦予其IHttpContextAccessor以使其可以正常工作。

就是這樣 這是我的Startup類,為靜態HttpContext.Current設置表。

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

例子:
public class MyService {

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM