Nécromancie.
OUI, vous pouvez, et voici comment.
Un conseil secret pour les grands migrateurs jonques des morceaux de code :
La méthode suivante est un piratage maléfique qui s'emploie activement à réaliser l'œuvre expresse de Satan (aux yeux des développeurs du cadre .NET Core), mais ça marche :
Sur public class Startup
ajouter une propriété
public IConfigurationRoot Configuration { get; }
Et ensuite ajouter un singleton IHttpContextAccessor à DI dans 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>();
Ensuite, dans Configurer
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
)
{
ajouter le paramètre DI IServiceProvider svp
La méthode ressemble donc à ceci :
public void Configure(
IApplicationBuilder app
,IHostingEnvironment env
,ILoggerFactory loggerFactory
,IServiceProvider svp)
{
Ensuite, créez une classe de remplacement pour 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
}
Maintenant, dans Configure, où vous avez ajouté le IServiceProvider svp
enregistrez ce fournisseur de services dans la variable statique "ServiceProvider" de la classe fictive System.Web.HttpContext (System.Web.HttpContext.ServiceProvider) que vous venez de créer.
et définissez HostingEnvironment.IsHosted comme étant vrai.
System.Web.Hosting.HostingEnvironment.m_IsHosted = true;
c'est essentiellement ce que System.Web a fait, mais vous ne l'avez jamais vu (je suppose que la variable a été déclarée comme interne au lieu de publique).
// 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
});
Comme dans ASP.NET Web-Forms, vous obtiendrez une NullReference lorsque vous essayez d'accéder à un HttpContext alors qu'il n'y en a pas, comme c'était le cas auparavant dans Application_Start
dans global.asax.
J'insiste encore une fois, cela ne fonctionne que si vous avez réellement ajouté
services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>();
comme je l'ai écrit, tu devrais.
Bienvenue au modèle ServiceLocator dans le modèle DI ;)
Pour connaître les risques et les effets secondaires, consultez votre médecin traitant ou votre pharmacien - ou étudiez les sources de .NET Core à l'adresse suivante github.com/aspnet et faire quelques tests.
Peut-être qu'une méthode plus facile à maintenir serait d'ajouter cette classe auxiliaire
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;
}
}
}
}
Et ensuite appeler HttpContext.Configure dans 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>()
);
3 votes
Demandez-vous d'abord pourquoi vous avez besoin d'y accéder à partir d'une bibliothèque de classes. Dans 80% des cas, il n'y a pas de raison et c'est une mauvaise conception d'essayer de le faire. Dans votre cas, ce n'est pas le cas. Changez la conception de votre bibliothèque de classes, passez les paramètres dont vous avez besoin plutôt que d'y accéder à partir d'elle. Moins de couplage, un code plus facile à maintenir. Regardez dans
IOptions<T>
0 votes
@Tseng disons que je veux le passer. Alors qu'est-ce que je suis censé passer ? C'est toute la question ici. Quel est l'espace de nom ou l'objet qui est équivalent à HttpContext dans ASP.NET Core ?
0 votes
Je lis votre question, et je me rends compte que ce n'est pas la question et qu'elle ne dit presque rien. Avec si peu d'informations, il est difficile de fournir des réponses. Ensuite, lisez mon premier commentaire pour trouver la bonne direction.
0 votes
@ScottHannen : Upvoter une question de mauvaise qualité n'est pas le but de l'OS. Le PO devrait lire la FAQ et poser des questions appropriées et détaillées expliquant ses besoins et ce qu'il a essayé d'accomplir jusqu'à présent pour résoudre le problème, plutôt que de simplement demander sans faire d'efforts. stackoverflow.com/help/asking Vous ne faites qu'encourager les gens à poser des questions de mauvaise qualité.
2 votes
En même temps, il ne faut pas que l'on croie que l'on n'a pas compris la question et que l'on vote contre. Vous avez fait un commentaire sur cette question, si vous avez compris ma réponse, votre commentaire n'est pas pertinent pour la question et il explique que vous n'avez pas du tout compris la question. Ainsi, quelqu'un comme vous continue à voter à la baisse, ce qui décourage les utilisateurs d'utiliser cette plateforme. Cette plateforme est destinée aux questions de qualité et aux réponses de qualité, pas seulement aux votes négatifs et positifs.
9 votes
@Tseng : dans votre commentaire, vous n'avez pas indiqué pourquoi vous pensiez que c'était une mauvaise question. Il s'agissait de savoir pourquoi la personne ne devrait pas essayer de faire ce qu'elle essaie de faire. Les gens utilisent
HttpContext.Current
partout dans ASP.NET, qu'ils le veuillent ou non. Je ne vois pas où est le mal à demander quel est l'équivalent dans ASP.NET Core. La réponse peut être qu'il n'y en a pas ou qu'il y a un moyen différent/meilleur.0 votes
Qu'est-ce que vous essayez d'obtenir du HttpContext ?
0 votes
Obtenir l'hôte actuel comme ceci $"{current.Request.Url.Scheme}://{current.Request.Url.Host}{(current.Request.Url.Port == 80 ? "" : " :" + current.Request.Url.Port)}" ;