分享一篇文章,關於asp.net core中httpcontext的拓展。 現在,試圖圍繞HttpContext.Current構建你的代碼真的不是一個好主意,但是我想如果你正在遷移一個企業類型的應用程式,那麼很多HttpContext.Current會圍繞這個業務邏輯,它可能會提供一些暫時的緩解移 ...
分享一篇文章,關於asp.net core中httpcontext的拓展。
現在,試圖圍繞HttpContext.Current構建你的代碼真的不是一個好主意,但是我想如果你正在遷移一個企業類型的應用程式,那麼很多HttpContext.Current會圍繞這個業務邏輯,它可能會提供一些暫時的緩解移植應用程式的條款。另外,在過去我已經寫了一些我不一定認為是好主意的事情。
我們現代的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 } }好了這篇文章也解了我很久的惑,今天就分享到這裡!
歡迎大家關註我都我的微信 公眾號,公眾號漲粉絲人數,就是你們對我的喜愛程度!