Necromancing.
EVET YAPABİLİRSİN
büyük göçmenler için gizli ipucujunkskod parçacıkları (iç çekiş, Freudcu kayma).
Aşağıdaki yöntem aktif (NET Çekirdek çerçeve geliştiricileri gözünde) şeytanın ekspres çalışmalarını yürüten yapan bir hack bir kötülük kan çıbanı olduğunu ama çalışıyor :
İçinde public class Startup
mülk ekle
public IConfigurationRoot Configuration { get; }
Ve sonra ConfigureServices'da DI'ye tek bir IHttpContextAccessor ekleyin.
// 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>();
Sonra Yapılandırda
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
)
{
DI Parametresini ekleyin IServiceProvider svp
, böylece yöntem şöyle görünür:
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
,IServiceProvider svp)
{
Ardından, System.Web için bir değiştirme sınıfı oluşturun:
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
}
Şimdi IServiceProvider svp
, bu hizmet sağlayıcıyı eklediğiniz Configure'da, yeni oluşturulan kukla sınıf System.Web.HttpContext (System.Web.HttpContext.ServiceProvider) içindeki "ServiceProvider" statik değişkenine kaydedin.
ve HostingEnvironment.IsHosted değerini true olarak ayarlayın
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
System.Web'in yaptığı şey buydu, siz onu hiç görmediniz (sanırım değişken public yerine dahili olarak ilan edildi).
// 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
});
ASP.NET Web Formlarında olduğu gibi Application_Start
, global.asax içinde olduğu gibi, hiçbiri olmadığında bir HttpContext'e erişmeye çalıştığınızda bir NullReference alırsınız .
Tekrar vurguluyorum, bu yalnızca gerçekten eklerseniz işe yarar
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
yazdığım gibi yapmalısın.
DI modeli içindeki ServiceLocator modeline hoş geldiniz;)
Riskler ve yan etkiler için, doktorunuza veya eczacınıza danışın - veya github.com/aspnet adresinde .NET Core kaynaklarını inceleyin ve bazı testler yapın.
Belki de daha sürdürülebilir bir yöntem bu yardımcı sınıfı eklemek olabilir
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;
}
}
}
}
Ve sonra Başlangıç-> Yapılandır'da HttpContext.Configure çağrısı
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
yalnızca DI kapsayıcısının örneği çözdüğü yerlerde kullanılabileceğini belirtmekte fayda var .