Ruft die Roh-URL von Microsoft.AspNet.Http.HttpRequest ab

87

Die HttpRequestKlasse in Asp.Net 5 (vNext) enthält (unter anderem) analysiert Details über die URL für die Anforderung, wie Scheme, Host, Pathusw.

Ich habe noch nirgendwo etwas entdeckt, das die ursprüngliche Anforderungs-URL anzeigt - nur diese analysierten Werte. (In früheren Versionen gab es Request.Uri)

Kann ich die unformatierte URL zurückerhalten, ohne sie aus den auf HttpRequest verfügbaren Komponenten zusammensetzen zu müssen?

Jon Egerton
quelle
1
Ein Fehler wurde anscheinend früher gemeldet, aber geschlossen ... Sie können wahrscheinlich die Details überprüfen und, wenn Sie sich stärker fühlen, ihn mit Details aktualisieren: github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa
@KiranChalla: Ich verstehe das irgendwie, obwohl ich mich frage, was die RawURL in früheren Versionen dann ist. Ich denke, was sie derzeit über das Schema, den Host usw. anzeigen, kann von der serverseitigen Behandlung der Anfrage und nicht von irgendetwas auf der Anfrage selbst unterschieden werden.
Jon Egerton
Hast du ToString () ausprobiert?
Agua vom Mars

Antworten:

82

Es sieht so aus, als könnten Sie nicht direkt darauf zugreifen, aber Sie können es mit dem Framework erstellen:

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

Sie können das oben genannte auch als Erweiterungsmethode verwenden.

Dies gibt stringeher ein als ein zurück Uri, aber es sollte den Zweck erfüllen! (Dies scheint auch der Rolle des UriBuilderzu dienen.)

Vielen Dank an @mswietlicki für den Hinweis, dass es nur überarbeitet wurde, anstatt zu fehlen! Und auch an @CF, um auf die Änderung des Namespace in meiner Antwort hinzuweisen!

Matt DeKrey
quelle
4
Dies funktioniert ab Beta-5 nicht mehr. Ich habe keine gute Alternative oder würde meine Antwort aktualisieren.
Matt DeKrey
13
Ich glaube, dies wurde zu einer echten Erweiterungsmethode gemacht - Sie importieren einfach den Namespace und rufen je nach Anwendungsfall entweder GetEncodedUrioder GetDisplayUriauf.
dlras2
42
using Microsoft.AspNet.Http.Extensions; und das Request.GetDisplayUrl ()
mswietlicki
8
Der richtige Namespace ist jetzt Microsoft.AspNetCore.Http.Extensions
CF
9
Fügen Sie für ASP.NET Core 1.0 die Verwendung von "Microsoft.AspNetCore.Http.Extensions" zu Ihrer Razor-Ansicht hinzu. Um die URL zu erhalten, verwenden Sie "@ Context.Request.GetDisplayUrl ()".
Joop
75

Fügen Sie das Nuget-Paket hinzu / using:

using Microsoft.AspNetCore.Http.Extensions; 

(In ASP.NET Core RC1 war dies in Microsoft.AspNet.Http.Extensions)

Dann können Sie die vollständige http-Anforderungs-URL erhalten, indem Sie Folgendes ausführen:

var url = httpContext.Request.GetEncodedUrl();

oder

var url = httpContext.Request.GetDisplayUrl();

abhängig von den Zwecken.

Velin Georgiev
quelle
Ist ASP.NET Core RC2 jetzt verfügbar?
Sergey G.
In Bezug auf die Quelle führen diese eindeutig eine Codierung / Decodierung durch, sodass dies nicht die unformatierte URL ist. Außerdem ändert IIS manchmal die URL, bevor es zu Kestrel gelangt, z. B.% 2F -> /.
Daniel Leach
1
@ TomStickel Ich bin mir nicht sicher, wovon du sprichst ... Ich hatte kein Problem damit, einen von beiden zu verwenden. Stellen Sie sicher, dass Sie die usingDirektive in Ihrer Datei haben, wie in der Antwort beschrieben, da dies keine "normalen" Methoden sind, sondern Erweiterungsmethoden.
Nick Mertin
1
@ TomStickel Messe. Ich stelle nur fest, dass mit dem für ASP.NET Core 2.2 installierten Microsoft.AspNetCore.All-Paket (ebenfalls auf 2.0 getestet) dies für mich gut funktioniert.
Nick Mertin
15

Wenn Sie wirklich die tatsächliche, unformatierte URL möchten , können Sie die folgende Erweiterungsmethode verwenden:

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);
    }
}

Diese Methode verwendet die RawTargetAnforderung, die nicht auf dem HttpRequestObjekt selbst angezeigt wird . Diese Eigenschaft wurde in der Version 1.0.0 von ASP.NET Core hinzugefügt. Stellen Sie sicher, dass Sie diese oder eine neuere Version ausführen.

HINWEIS! Diese Eigenschaft macht die unformatierte URL verfügbar, sodass sie nicht dekodiert wurde, wie in der Dokumentation angegeben:

Diese Eigenschaft wird intern nicht für Routing- oder Autorisierungsentscheidungen verwendet. Es wurde nicht urlDecodiert und sollte bei der Verwendung vorsichtig sein.

Khellang
quelle
Ich verwende ASP .NET Core mit vollständigem .NET Framework. Dies scheint bei mir nicht zu funktionieren ( RawTargetist nicht definiert IHttpRequestFeature). Können Sie sich eine Alternative vorstellen?
Tomáš Hübelbauer
1
RawTargetwurde in der Version 1.0 bereits im Mai hinzugefügt . Sind Sie sicher, dass Sie mit der neuesten Version arbeiten?
Khellang
1
Wenn Sie mit IIS hosten, ändert IIS manchmal die URL, bevor es zu Kestrel gelangt. Ein Beispiel hierfür ist, dass% 2F in / dekodiert wird.
Daniel Leach
Dies ist bei weitem die maßgebliche Antwort.
Chris Marisic
Dies scheint eher den URL-Pfad als die gesamte URL anzugeben
Iain Ballard
10

In .NET Core-Rasiermesser:

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

Sie können auch anstelle der zweiten Zeile Folgendes verwenden:

@Context.Request.GetDisplayUrl() //Use to display the URL only
Shadi Namrouti
quelle
7

Die anderen Lösungen passten nicht gut zu meinen Anforderungen, da ich direkt ein URIObjekt haben wollte und ich denke, dass es in diesem Fall besser ist, die Verkettung von Zeichenfolgen (auch) zu vermeiden. UriBuilderDeshalb habe ich diese Erweiterungsmethoden erstellt, als a zu verwenden und arbeite auch mit URLs wie 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
quelle
1
Gut. Außerdem habe ich Ihre Lösung mit optionalen Parametern verbessert. Daher kann ich steuern, welchen Teil der URI ich abrufen möchte. Zum Beispiel nur Host oder vollständiger Pfad ohne
Abfragezeichenfolge
@ user3172616 schöne Idee!
Giammin
1
(80)sollte sein (-1). Wenn Sie ein https-Schema haben, bei dem der Port im "Host" -Header weggelassen wurde, wird ein falscher Uri generiert (z. B. https://myweb:80/mit (-1)diesem https://myweb).
Igor Dražić
4

Die folgende Erweiterungsmethode gibt die Logik aus der Zeit vor Beta5 wieder 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
quelle
3

Diese Erweiterung funktioniert für mich:

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

In ASP.NET 5 Beta5:

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