Obtenir l'URL brute de Microsoft.AspNet.Http.HttpRequest

87

La HttpRequestclasse 5 Asp.Net (vNext) contient (entre autres) les détails sur l'URL analysables pour la demande, par exemple Scheme, Host, Pathetc.

Cependant, je n'ai encore repéré nulle part qui expose l'URL de la demande d'origine - 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 à la reconstituer à partir des composants disponibles sur HttpRequest?

Jon Egerton
la source
1
Un bug semble avoir été déposé plus tôt à ce sujet mais fermé ... vous pouvez probablement en vérifier les détails et si vous vous sentez plus fort, peut-être le mettre à jour avec des détails: github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa
@KiranChalla: Je comprends en quelque sorte leur point de vue, même si cela m'amène à me demander ce qu'est le RawURL dans les versions précédentes. Je suppose que ce qu'ils montrent actuellement à propos du schéma, de l'hôte, etc. peut être deviné à partir de la gestion côté serveur de la demande, et pas de quoi que ce soit sur la demande elle-même.
Jon Egerton
avez-vous essayé ToString ()?
agua du

Réponses:

82

Il semble que vous ne pouvez pas y accéder directement, mais vous pouvez le créer à l'aide du framework:

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

Vous pouvez également utiliser ce qui précède comme méthode d'extension.

Cela renvoie un stringplutôt qu'un a Uri, mais cela devrait servir le but! (Cela semble également servir le rôle du UriBuilder, aussi.)

Merci à @mswietlicki pour avoir souligné qu'il vient d'être refacturé plutôt que de manquer! Et aussi à @CF pour signaler le changement d'espace de noms dans ma réponse!

Matt DeKrey
la source
4
Cela ne fonctionne plus à partir de la version bêta-5. Je n'ai pas de bonne alternative ou je mettrais à jour ma réponse.
Matt DeKrey
13
Je pense que cela a été une véritable méthode d'extension - il vous suffit d'importer l'espace de noms et d'appeler soit GetEncodedUriou GetDisplayUri, selon votre cas d'utilisation.
dlras2 du
42
en utilisant Microsoft.AspNet.Http.Extensions; et que Request.GetDisplayUrl ()
mswietlicki
8
Le bon espace de noms est maintenant Microsoft.AspNetCore.Http.Extensions
CF
9
Pour ASP.NET Core 1.0, ajoutez l'utilisation de «Microsoft.AspNetCore.Http.Extensions» à votre vue Razor. Pour obtenir l'URL, utilisez "@ Context.Request.GetDisplayUrl ()".
Joop
75

Ajoutez le package Nuget / en utilisant:

using Microsoft.AspNetCore.Http.Extensions; 

(Dans ASP.NET Core RC1, c'était dans Microsoft.AspNet.Http.Extensions)

alors vous pouvez obtenir l'URL complète de la requête http en exécutant:

var url = httpContext.Request.GetEncodedUrl();

ou

var url = httpContext.Request.GetDisplayUrl();

selon les finalités.

Velin Georgiev
la source
ASP.NET Core RC2 est-il disponible maintenant?
Sergey G.15
En regardant la source, ceux-ci effectuent clairement un encodage / décodage donc ce ne sera pas l'URL brute. De plus, IIS change parfois l'URL avant d'arriver à Kestrel, par exemple% 2F -> /.
Daniel Leach
1
@TomStickel Je ne sais pas de quoi vous parlez ... Je n'ai eu aucun problème à les utiliser. Assurez-vous d'avoir la usingdirective dans votre fichier comme décrit dans la réponse, car ce ne sont pas des méthodes "normales", mais plutôt des méthodes d'extension.
Nick Mertin
1
@TomStickel juste. Notant simplement qu'avec le package Microsoft.AspNetCore.All installé pour ASP.NET Core 2.2 (également testé sur 2.0), cela fonctionne très bien pour moi.
Nick Mertin
16

Si vous voulez vraiment l' URL brute réelle, vous pouvez utiliser la 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 RawTargetde la requête, qui n'apparaît pas sur l' HttpRequestobjet lui-même. Cette propriété a été ajoutée dans la version 1.0.0 d'ASP.NET Core. Assurez-vous que vous exécutez cela ou une version plus récente.

REMARQUE! Cette propriété expose l' URL brute , elle n'a donc 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é UrlDecoded et des précautions doivent être prises dans son utilisation.

Khellang
la source
J'utilise ASP .NET Core avec .NET Framework complet. Cela ne semble pas fonctionner pour moi ( RawTargetn'est pas défini sur IHttpRequestFeature). Pouvez-vous penser à une alternative?
Tomáš Hübelbauer
1
RawTargeta été ajouté dans la version 1.0, en mai . Êtes-vous sûr d'utiliser la dernière version?
khellang
1
Si l'hébergement utilise IIS, IIS change parfois l'URL avant d'arriver à Kestrel. Un exemple de ceci est que% 2F est décodé en /.
Daniel Leach
C'est de loin la réponse qui fait autorité.
Chris Marisic
Cela semble donner le chemin de l'URL plutôt que l'URL entière
Iain Ballard
10

Dans le rasoir .NET Core:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

Vous pouvez également utiliser à la place de la deuxième ligne:

@Context.Request.GetDisplayUrl() //Use to display the URL only
Shadi Namrouti
la source
8

Les autres solutions ne correspondaient pas bien à mes besoins car je voulais directement un URIobjet et je pense qu'il vaut mieux éviter la concaténation de chaînes (également) dans ce cas, j'ai donc créé cette méthode d'extension plutôt que d'utiliser a UriBuilderet 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;
}
giammin
la source
1
Bon. J'ai également amélioré votre solution avec des paramètres optionnels. Par conséquent, je peux contrôler quelle partie de l'URI je veux récupérer. Par exemple, hôte uniquement ou chemin complet sans chaîne de requête, etc.
user3172616
@ user3172616 belle idée!
giammin
1
(80)devrait être (-1). Lorsque vous avez un schéma https avec le port omis dans l'en-tête "Host", cela générera un Uri erroné (par exemple https://myweb:80/, avec (-1)lui https://myweb).
Igor Dražić
4

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;
}
Sam
la source
3

Cette extension fonctionne pour moi:

en utilisant 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}";
        }
    }
Mark Redman
la source
0

Dans ASP.NET 5 beta5:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
Enfant intelligent
la source