Necromancing.
YA ANDA BISA
Tip rahasia untuk mereka yang bermigrasi besarjungpotongan (sigh, Freudian slip) dari kode.
Metode berikut ini adalah serangan jahat dari peretasan yang secara aktif terlibat dalam melaksanakan pekerjaan ekspres setan (di mata pengembang kerangka .NET Core), tetapi berfungsi :
Di public class Startup
tambahkan properti
public IConfigurationRoot Configuration { get; }
Dan kemudian tambahkan IHttpContextAccessor tunggal ke DI di ConfigureServices.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
Kemudian di Configure
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
)
{
tambahkan Parameter DI IServiceProvider svp
, sehingga metodenya seperti:
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
,IServiceProvider svp)
{
Selanjutnya, buat kelas pengganti untuk System.Web:
namespace System.Web
{
namespace Hosting
{
public static class HostingEnvironment
{
public static bool m_IsHosted;
static HostingEnvironment()
{
m_IsHosted = false;
}
public static bool IsHosted
{
get
{
return m_IsHosted;
}
}
}
}
public static class HttpContext
{
public static IServiceProvider ServiceProvider;
static HttpContext()
{ }
public static Microsoft.AspNetCore.Http.HttpContext Current
{
get
{
// var factory2 = ServiceProvider.GetService<Microsoft.AspNetCore.Http.IHttpContextAccessor>();
object factory = ServiceProvider.GetService(typeof(Microsoft.AspNetCore.Http.IHttpContextAccessor));
// Microsoft.AspNetCore.Http.HttpContextAccessor fac =(Microsoft.AspNetCore.Http.HttpContextAccessor)factory;
Microsoft.AspNetCore.Http.HttpContext context = ((Microsoft.AspNetCore.Http.HttpContextAccessor)factory).HttpContext;
// context.Response.WriteAsync("Test");
return context;
}
}
} // End Class HttpContext
}
Sekarang di Konfigurasi, di mana Anda menambahkan IServiceProvider svp
, simpan penyedia layanan ini ke variabel statis "ServiceProvider" di System.Web.HttpContext kelas baru saja dibuat (System.Web.HttpContext.ServiceProvider)
dan atur HostingEnvironment.Hosted ke true
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
ini pada dasarnya apa yang dilakukan System.Web, hanya saja Anda tidak pernah melihatnya (saya kira variabel tersebut dinyatakan sebagai internal, bukan publik).
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider svp)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
ServiceProvider = svp;
System.Web.HttpContext.ServiceProvider = svp;
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "MyCookieMiddlewareInstance",
LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Unauthorized/"),
AccessDeniedPath = new Microsoft.AspNetCore.Http.PathString("/Account/Forbidden/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true,
CookieSecure = Microsoft.AspNetCore.Http.CookieSecurePolicy.SameAsRequest
, CookieHttpOnly=false
});
Seperti di ASP.NET Web-Forms, Anda akan mendapatkan NullReference ketika Anda mencoba mengakses HttpContext ketika tidak ada, seperti dulu Application_Start
di global.asax.
Saya tekankan lagi, ini hanya berfungsi jika Anda benar-benar menambahkan
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
seperti yang saya tulis Anda harus.
Selamat datang di pola ServiceLocator dalam pola DI;)
Untuk risiko dan efek samping, tanyakan dokter atau apoteker Anda - atau pelajari sumber .NET Core di github.com/aspnet , dan lakukan beberapa pengujian.
Mungkin metode yang lebih bisa dipertahankan adalah menambahkan kelas pembantu ini
namespace System.Web
{
public static class HttpContext
{
private static Microsoft.AspNetCore.Http.IHttpContextAccessor m_httpContextAccessor;
public static void Configure(Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor)
{
m_httpContextAccessor = httpContextAccessor;
}
public static Microsoft.AspNetCore.Http.HttpContext Current
{
get
{
return m_httpContextAccessor.HttpContext;
}
}
}
}
Dan kemudian memanggil HttpContext.Configure di Startup-> Configure
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider svp)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
System.Web.HttpContext.Configure(app.ApplicationServices.
GetRequiredService<Microsoft.AspNetCore.Http.IHttpContextAccessor>()
);
IHttpContextAccessor
hanya akan tersedia di tempat-tempat di mana wadah DI sedang menyelesaikan instance.