La classe HttpRequest
dans Asp.Net 5 (vNext) contient (entre autres) des détails analysés sur l'URL de la requête, tels que Scheme
, Host
, Path
etc.
Je n'ai encore rien vu qui expose l'URL de la demande d'origine, mais uniquement ces valeurs analysées. (Dans les versions précédentes, il y avait Request.Uri
)
Puis-je récupérer l'URL brute sans avoir à l'assembler à partir des composants disponibles sur HttpRequest?
On dirait que vous ne pouvez pas y accéder directement, mais vous pouvez le construire en utilisant le framework:
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
Vous pouvez également utiliser ce qui précède comme méthode d’extension.
Ceci retourne un string
plutôt qu'un Uri
, mais il devrait servir à cela! (Cela semble aussi jouer le rôle du UriBuilder
, aussi.)
Merci à @mswietlicki d’avoir fait remarquer que cela vient tout juste d’être refondu plutôt que de manquer! Et aussi @ C-F pour souligner le changement d’espace de nom dans ma réponse!
Ajoutez le paquet Nuget/using:
using Microsoft.AspNetCore.Http.Extensions;
(Dans ASP.NET Core RC1, il s'agissait de Microsoft.AspNet.Http.Extensions)
vous pouvez alors obtenir l’URL complète de la requête http en exécutant:
var url = httpContext.Request.GetEncodedUrl();
ou
var url = httpContext.Request.GetDisplayUrl();
en fonction des objectifs.
Si vous voulez vraiment l'URL réelle brute , vous pouvez utiliser le méthode d'extension suivante:
public static class HttpRequestExtensions
{
public static Uri GetRawUrl(this HttpRequest request)
{
var httpContext = request.HttpContext;
var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();
return new Uri(requestFeature.RawTarget);
}
}
Cette méthode utilise le RawTarget
de la demande, qui n'est pas surfacé sur l'objet HttpRequest
lui-même. Cette propriété a été ajoutée à la version 1.0.0 d'ASP.NET Core. Assurez-vous que vous utilisez cette version ou une version plus récente.
NOTE! Cette propriété expose l'URL brute brute , de sorte qu'elle n'a pas été décodée, comme indiqué dans la documentation:
Cette propriété n'est pas utilisée en interne pour les décisions de routage ou d'autorisation. Il n’a pas été codé en url et son utilisation doit être faite avec soin.
Les autres solutions ne répondaient pas bien à mes besoins car je voulais directement un objet URI
et je pense qu'il est préférable d'éviter la concaténation de chaînes (aussi) dans ce cas. J'ai donc créé cette méthode d'extension plutôt que d'utiliser un UriBuilder
et fonctionne aussi avec des URL comme http://localhost:2050
:
public static Uri GetUri(this HttpRequest request)
{
var uriBuilder = new UriBuilder
{
Scheme = request.Scheme,
Host = request.Host.Host,
Port = request.Host.Port.GetValueOrDefault(80),
Path = request.Path.ToString(),
Query = request.QueryString.ToString()
};
return uriBuilder.Uri;
}
Dans les pages de rasoir ASP.NET Core 2.x:
@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)
Il y a aussi une autre fonction:
@Context.Request.GetDisplayUrl() //Use to display the URL only
La méthode d'extension suivante reproduit la logique de la pré-beta5 UriHelper
:
public static string RawUrl(this HttpRequest request) {
if (string.IsNullOrEmpty(request.Scheme)) {
throw new InvalidOperationException("Missing Scheme");
}
if (!request.Host.HasValue) {
throw new InvalidOperationException("Missing Host");
}
string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
return request.Scheme + "://" + request.Host + path + request.QueryString;
}
Cette extension fonctionne pour moi:
using Microsoft.AspNetCore.Http;
public static class HttpRequestExtensions
{
public static string GetRawUrl(this HttpRequest request)
{
var httpContext = request.HttpContext;
return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
}
}
Dans ASP.NET 5 beta5:
Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);