Necromancing।
हाँ आप
बड़े प्रवास करने वालों के लिए गुप्त टिप दे सकते हैंjunksकोड के टुकड़े (आह, फ्रायडियन पर्ची)।
निम्नलिखित विधि एक हैक का एक दुष्ट कार्बुनकल है जो सक्रिय रूप से शैतान के एक्सप्रेस काम (.NET कोर फ्रेमवर्क डेवलपर्स की आँखों में) को पूरा करने में लगी हुई है, लेकिन यह काम करता है :
में public class Startup
एक संपत्ति जोड़ें
public IConfigurationRoot Configuration { get; }
और फिर ConfigureServices में DI के लिए एक सिंगलटन IHttpContextAccessor जोड़ें।
// 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>();
फिर कन्फिगर में
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
)
{
DI पैरामीटर जोड़ें IServiceProvider svp
, ताकि विधि इस प्रकार दिखे:
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
,IServiceProvider svp)
{
अगला, 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
, इस सेवा प्रदाता को केवल बनाए गए डमी क्लास में स्थिर चर "ServiceProvider" में सेव करें। System.eb.HttpContext (System.Web.HttpContext.ServiceProvider)
और HostingEnvironment.sHost को सही पर सेट करें
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
यह अनिवार्य रूप से System.Web ने क्या किया, बस आपने इसे कभी नहीं देखा (मुझे लगता है कि चर को जनता के बजाय आंतरिक के रूप में घोषित किया गया था)।
// 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 वेब-फॉर्म्स की तरह, जब आप कोई HttpContext एक्सेस करने का प्रयास कर रहे हैं, तो आपको एक NullReference मिलेगा, जैसे कि कोई नहीं है, जैसे कि यह Application_Start
Global.asax में हुआ करता था।
मैं फिर से जोर देता हूं, यह केवल तभी काम करता है जब आप वास्तव में जोड़े
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
जैसे मैंने आपको लिखा होना चाहिए।
DI पैटर्न के भीतर ServiceLocator पैटर्न में आपका स्वागत है;)
जोखिम और दुष्प्रभावों के लिए, अपने निवासी डॉक्टर या फार्मासिस्ट से पूछें - या github.com/aspnet पर .NET कोर के स्रोतों का अध्ययन करें , और कुछ परीक्षण करें।
शायद अधिक सहायक विधि इस सहायक वर्ग को जोड़ रही होगी
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;
}
}
}
}
और उसके बाद HttpContext.Configure को 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
केवल उन स्थानों पर उपलब्ध होगा जहां डीआई कंटेनर उदाहरण का समाधान कर रहा है।