Necromance.
CÓ BẠN CÓ THỂ
Mẹo bí mật cho những người di cư lớntháng sáuchunk (thở dài, trượt Freud) của mã.
Phương pháp sau đây là một kẻ tấn công độc ác của một vụ hack đang tích cực thực hiện công việc nhanh của satan (trong mắt các nhà phát triển khung .NET Core), nhưng nó hoạt động :
Trong public class Startup
thêm một tài sản
public IConfigurationRoot Configuration { get; }
Và sau đó thêm một IHttpContextAccessor vào DI trong ConfigureService.
// 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>();
Sau đó, trong Cấu hình
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
)
{
thêm tham số DI IServiceProvider svp
, vì vậy phương thức này trông như sau:
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
,IServiceProvider svp)
{
Tiếp theo, tạo một lớp thay thế cho 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
}
Bây giờ trong Cấu hình, nơi bạn đã thêm IServiceProvider svp
, lưu nhà cung cấp dịch vụ này vào biến tĩnh "ServiceProvider" trong lớp giả vừa tạo System.Web.HttpContext (System.Web.HttpContext.ServiceProvider)
và đặt HostingEn Môi trường. Lưu trữ thành đúng
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
đây thực chất là những gì System.Web đã làm, chỉ là bạn chưa bao giờ thấy nó (tôi đoán biến được khai báo là nội bộ thay vì công khai).
// 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
});
Giống như trong ASP.NET Web-Forms, bạn sẽ nhận được NullReference khi bạn đang cố truy cập vào một HTTPContext khi không có, chẳng hạn như nó đã từng tồn tại Application_Start
trong global.asax.
Tôi nhấn mạnh một lần nữa, điều này chỉ hoạt động nếu bạn thực sự thêm
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
như tôi đã viết bạn nên
Chào mừng bạn đến với mẫu ServiceLocator trong mẫu DI;)
Đối với các rủi ro và tác dụng phụ, hãy hỏi bác sĩ nội trú hoặc dược sĩ của bạn - hoặc nghiên cứu các nguồn của .NET Core tại github.com/aspnet và thực hiện một số thử nghiệm.
Có lẽ một phương pháp dễ bảo trì hơn sẽ là thêm lớp người trợ giúp này
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;
}
}
}
}
Và sau đó gọi httpContext.Configure trong Khởi động-> Cấu hình
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
sẽ chỉ khả dụng ở những nơi mà container DI đang giải quyết thể hiện.