我們現代的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
} }