Nekromantie.
JA, SIE KÖNNEN
Geheimtipp für diejenigen, die groß migrierenJunksBrocken (Seufzer, Freudscher Ausrutscher) des Codes.
Die folgende Methode ist ein böser Karbunkel eines Hacks, der aktiv an der Ausführung der Expressarbeit von Satan beteiligt ist (in den Augen von .NET Core-Framework-Entwicklern), aber sie funktioniert :
Im public class Startup
Fügen Sie eine Eigenschaft hinzu
public IConfigurationRoot Configuration { get; }
Fügen Sie dann DI in ConfigureServices einen Singleton-IHttpContextAccessor hinzu.
// 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>();
Dann in Konfigurieren
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
)
{
Fügen Sie den DI-Parameter hinzu IServiceProvider svp
, damit die Methode wie folgt aussieht:
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
,IServiceProvider svp)
{
Erstellen Sie als Nächstes eine Ersatzklasse für 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
}
IServiceProvider svp
Speichern Sie nun in Configure, wo Sie den hinzugefügt haben , diesen Dienstanbieter in der statischen Variablen "ServiceProvider" in der gerade erstellten Dummy-Klasse System.Web.HttpContext (System.Web.HttpContext.ServiceProvider).
und setzen Sie HostingEnvironment.IsHosted auf true
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
Dies ist im Wesentlichen das, was System.Web getan hat, nur dass Sie es nie gesehen haben (ich denke, die Variable wurde als intern statt öffentlich deklariert).
// 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
});
Wie in ASP.NET Web-Forms erhalten Sie eine NullReference, wenn Sie versuchen, auf einen HttpContext zuzugreifen, wenn keiner vorhanden ist, wie er früher Application_Start
in global.asax enthalten war.
Ich betone noch einmal, das funktioniert nur, wenn Sie tatsächlich hinzugefügt haben
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
wie ich dir geschrieben habe solltest du.
Willkommen beim ServiceLocator-Muster innerhalb des DI-Musters;)
Fragen Sie Ihren Arzt oder Apotheker nach Risiken und Nebenwirkungen - oder untersuchen Sie die Quellen von .NET Core unter github.com/aspnet und führen Sie einige Tests durch.
Vielleicht wäre eine wartbarere Methode das Hinzufügen dieser Hilfsklasse
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;
}
}
}
}
Rufen Sie dann HttpContext.Configure unter Startup-> Configure auf
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
dies nur an Stellen verfügbar ist, an denen der DI-Container die Instanz auflöst.