現(xiàn)在,試圖圍繞HttpContext.Current構(gòu)建你的代碼真的不是一個好主意,但是我想如果你正在遷移一個企業(yè)類型的應(yīng)用程序,那么很多HttpContext.Current會圍繞這個業(yè)務(wù)邏輯,它可能會提供一些暫時的緩解移植應(yīng)用程序的條款。另外,在過去我已經(jīng)寫了一些我不一定認(rèn)為是好主意的事情。
我們現(xiàn)代的HttpContext.Current將依賴于從IHttpContextAccessor解析上下文,并且可能如下所示:
{
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;
}
}
}
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。這可以通過兩種擴展方法來實現(xiàn):
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ào)用,并在DI中注冊訪問器。我們已經(jīng)確定,這是默認(rèn)IHttpContextFactory正確分享其HttpContext實例所必需的。
第二個將在啟動時從Configure中調(diào)用,并且它將確保我們的自定義HttpContext.Current被賦予其IHttpContextAccessor以使其可以正常工作。
就是這樣 這是我的Startup類,為靜態(tài)HttpContext.Current設(shè)置表。
public class Startup
{
public void ConfigureServices(IServiceCollectionservices)
{
services.AddHttpContextAccessor();
}
public void Configure(IApplicationBuilderapp)
{
app.UseStaticHttpContext();
app.UseMvc();
}
}
例子:
public class MyService
{
public void DoWork()
{
varcontext=HttpContext.Current;
// continue with context instance
}
}