web-dev-qa-db-fra.com

Obtenir une URL brute à partir de Microsoft.AspNet.Http.HttpRequest

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?

58
Jon Egerton

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!

54
Matt DeKrey

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.

40
Velin Georgiev

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.

7
khellang

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;
}
5
giammin

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
5
Shadi Namrouti

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;
}
4
Sam

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}";
        }
    }
2
Mark Redman

Dans ASP.NET 5 beta5:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
0
Smartkid