Comment accéder à courant Uri absolu de toute ASP .Net classe de Base?
Je suis à essayer de comprendre comment accéder à la actuel Uri absolu -- c'est à dire l'url absolue de la vue qui est actuellement en cours de rendu -- d'une classe d'utilisateur .Net De Base 1.1
J'ai trouvé ce lien, mais il semble être obsolète et déclenche une erreur après erreur: Obtenir les Url absolues à l'aide de ASP.NET Core, MVC 6
Dans mon Démarrage.cs que j'ai ConfigureServices:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Dans mon Démarrage.cs que j'ai Configurer:
IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);
J'ai la classe suivante:
using Microsoft.AspNetCore.Http;
using System;
namespace Framework.Extensions
{
public static class Context
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
private static HttpContext GetCurrentContext()
{
return HttpContextAccessor.HttpContext;
}
public static HttpContext Current = GetCurrentContext();
private static Uri GetAbsoluteUri()
{
UriBuilder uriBuilder = new UriBuilder();
uriBuilder.Scheme = GetCurrentContext().Request.Scheme;
uriBuilder.Host = GetCurrentContext().Request.Host.ToString();
uriBuilder.Path = GetCurrentContext().Request.Path.ToString();
uriBuilder.Query = GetCurrentContext().Request.QueryString.ToString();
return uriBuilder.Uri;
}
public static Uri AbsoluteUri = GetAbsoluteUri();
public static string Url = GetAbsoluteUri().ToString();
public static string AbsolutePath = GetAbsoluteUri().AbsolutePath;
}
}
- Je obtenir de l'exception suivante:
Système.TypeInitializationException a été gérée par le code de l'utilisateur
HResult=-2146233036 Message=L'initialiseur de type pour
"Cadre de référence.Extensions.Contexte " a déclenché une exception.
TypeName=Cadre.Extensions.Contexte InnerException:
HResult=-2147467261
Message=la référence d'Objet n'est pas définie à une instance d'un objet.
Source=www
StackTrace:
au Cadre.Extensions.Contexte.GetCurrentContext() dans E:\Websites\Stage\www\Extensions\Context.cs:line 16
au Cadre.Extensions.Contexte..cctor() dans E:\Websites\Stage\www\Extensions\Context.cs:line 18
InnerException:
J'ai ajouté mon code actuel et l'erreur est générée.
Vous ne pouvez pas avoir une propriété statique de la
Current
! Ce qui signifierait que vous utilisez toujours le même contexte, mais vous voulez que, conformément à la demande, et bien sûr, vous ne pouvez pas l'utiliser sur votre initialiseur comme il n'y a pas de demande du moment que la classe est initialisée. Il suffit de garder la IHttpContextAccessor
dans la statique hélice, puis récupérer le contexte actuel à l'intérieur de GetAbsoluteUri
J'ai essayé de retirer la statique Contexte de la propriété et de l'accès au contexte actuel à l'intérieur de la
GetAbsoluteUri()
méthode, mais je reçois "la référence d'Objet n'est pas définie à une instance d'un objet" sur la ligne suivante à l'intérieur de la GetAbsoluteUri()
méthode: HttpContext current = HttpContextAccessor.HttpContext;
stackoverflow.com/questions/4660142/... - assurez-vous que le
HttpContextAccessor
n'est pas nulle, car il doit avoir été définie dans la configuration de la méthode qui vous appelle sur votre startupOriginalL'auteur eat-sleep-code | 2017-03-02
Vous devez vous connecter pour publier un commentaire.
Vous voulez le
IHttpContextAccessor
"configuré ou injecté" dans votreStartup
donc plus tard, lorsque vous utilisez l'assistant pendant le contexte d'une demande, vous pouvez l'utiliser pour accéder à laHttpContext
objet.Vous ne pouvez pas stocker le contexte d'un champ statique que ce contexte n'a de sens alors qu'il purgeait une demande spécifique. En général, vous quitterez l'accesseur dans un champ statique et de l'utiliser à chaque fois que votre aide est appelée.
IHttpContextAccessor
encore configuré et vous obtiendrez ces références nulles.Ce serait une chose si simple d'écrire ce que vous voulez:
Plus qu'une chose à garder à l'esprit:
Ne
var request = HttpContextAccessor.HttpContext.Request;
jeter une erreur .. null ?OriginalL'auteur Daniel J.G.
Vous pouvez utiliser le
GetDisplayUrl
méthode d'extension.En supposant
httpContextAccessor
est un objet deIHttpContextAccessor
qui a été injecté via DI.Cette méthode d'extension est définie dans
Microsoft.AspNetCore.Http.Extensions
espace de noms. Si vous avez besoin d'avoir une instruction d'utilisation de l'inclure dans votre fichier.using Microsoft.AspNetCore.Http.Extensions;
Oh, en fait, ce qui fonctionne parfaitement dans le Contrôleur .net de base, j'ai voulu accéder à partir d'un démarrage.cs ... comme je suis de la migration de "l'héritage" .net pour .net de base et de l'accessibilité est beaucoup mieux
OriginalL'auteur Shyju
- Je utiliser cette api
oui, docs.microsoft.com/en-us/dotnet/api/... @TomStickel
OriginalL'auteur CelzioBR