So erhalten Sie die aktuelle URL in asp.net core 1.0

100

In früheren Versionen von asp.net konnten wir verwenden

@Request.Url.AbsoluteUri

Aber es scheint sich geändert zu haben. Wie können wir das in asp.net Core 1.0 tun?

oneNiceFriend
quelle
6
@ DavidG Es scheint, dass Sie jetzt UriHelper.GetDisplayUrl (Re‌ Quest) verwenden können
Mark G

Antworten:

120

Sie müssen den Host und den Pfad separat abrufen.

 @[email protected]
Clint B.
quelle
13
Dadurch wird nicht die richtige URL gemeldet, wenn sich Ihre App in einem virtuellen Verzeichnis befindet. Sie müssen dem Request.Path- Wert den Request.PathBase- Wert voranstellen , falls vorhanden. Dies gilt auch für fast alle anderen Antworten auf diese Frage.
Padigan
Was ist das @zwischen den beiden Saiten? Könntest du es erklären?
Mohammed Noureldin
3
@MohammedNoureldin: Das ist die Syntax der Rasiermesseransicht.
Jack.pop
2
Für Rasierseiten musste ich @HttpContextstattdessen verwenden @Context. Für Teilansichten @Contextfunktioniert. Habe ich eine Verwendung vergessen?
Andriod
2
Es gibt einen einfachen Weg in MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan
108

Sie benötigen Schema, Host, Pfad und queryString

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

oder mit der neuen C # 6-Funktion "String-Interpolation"

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
tmg
quelle
1
Wie erhalten Sie das Fragment, sagen wir test.com/abc#123 , wie erhalten Sie das Fragment Nr. 123 aus der Anfrage?
Ray
4
@ Fanray Du kannst nicht. Browser senden keine URI-Fragmente an den Server
tmg
Erwägen Sie die Verwendung von UriBuilder zum Erstellen von URLs.
Erik Philips
84

Sie können die Erweiterungsmethode verwenden von Request:

Request.GetDisplayUrl()
AlexBar
quelle
33
Dies funktioniert, wenn Sie @using Microsoft.AspNetCore.Http.Extensionsdann hinzufügen@Context.Request.GetDisplayUrl()
Serj Sagan
2
wird immer noch - Anfrage existiert nicht im aktuellen Kontext
SeanMC
1
Beachten Sie, dass in der Intellisense-Zusammenfassung für diese Funktion Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.Folgendes angegeben ist. Auf dieser Grundlage halte ich die Lösung von @ tmg für die beste (möglicherweise in Ihre eigene Erweiterungsmethode eingeschlossen).
Gordon Glas
16

Dies war anscheinend in .net Core 1.0 mit immer möglich Microsoft.AspNetCore.Http.Extensions, wodurch eine Erweiterung hinzugefügt wird HttpRequest, um die vollständige URL zu erhalten. GetEncodedUrl .

zB aus der Sicht des Rasiermessers:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Haben Sie seit 2.0 auch relativen Pfad und Abfrage GetEncodedPathAndQuery .

mcNux
quelle
15

Verwenden Sie die AbsoluteUri- Eigenschaft des Uri. Mit dem .Net-Kern müssen Sie den Uri aus einer solchen Anforderung erstellen.

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

Wenn die Anforderungs-URL beispielsweise " http://www.contoso.com/catalog/shownew.htm?date=today " lautet, wird dieselbe URL zurückgegeben.

Dhanuka777
quelle
8
Solche Dinge lassen mich nachdenken. Net Core ist in gewisser Hinsicht ein Rückschritt. Ist das besser als Request.Url in Asp.Net in einer Weise, die ich mir nicht vorstellen kann?
Soenhay
8

Sie können diese Erweiterungsmethode in Betracht ziehen (aus dem Microsoft.AspNetCore.Http.ExtensionsNamespace:

@Context.Request.GetDisplayUrl()

Für einige meiner Projekte bevorzuge ich eine flexiblere Lösung. Es gibt zwei Erweiterungsmethoden.

1) Die erste Methode erstellt ein UriObjekt aus eingehenden Anforderungsdaten (mit einigen Varianten über optionale Parameter). 2) Die zweite Methode empfängt ein UriObjekt und gibt es stringim folgenden Format zurück (ohne abschließenden Schrägstrich): Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

Verwendung:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304
user3172616
quelle
7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}
Sergey
quelle
aber wo bekommen Sie httpContext? Das wird nicht funktionieren mit Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel
7

Wenn Sie auch die Portnummer aus der Anfrage herausholen möchten, müssen Sie über dieRequest.Host herausholen Eigenschaft für AspNet Core darauf zugreifen.

Die Request.HostEigenschaft ist nicht einfach eine Zeichenfolge, sondern ein Objekt, das sowohl die Hostdomäne als auch die Portnummer enthält. Wenn die Portnummer speziell ist geschrieben in der URL (dh "https://example.com:8080/path/to/resource"), dann Aufruf Request.Hostgibt Ihnen die Host - Domäne und die Portnummer wie folgt: "example.com:8080".

Wenn Sie nur den Wert für die Hostdomäne oder nur den Wert für die Portnummer möchten, können Sie einzeln auf diese Eigenschaften zugreifen (dh Request.Host.Hostoder Request.Host.Port).

Hallmanach
quelle
6

Die akzeptierte Antwort hat mir geholfen, ebenso wie der Kommentar von @padigan, aber wenn Sie die Abfragezeichenfolgenparameter wie bei mir einschließen möchten, versuchen Sie Folgendes:

@[email protected]()

@using Microsoft.AspNetCore.Http.ExtensionsAußerdem müssen Sie die Ansicht hinzufügen , damit die Methode GetEncodedPathAndQuery () verfügbar ist.

Christopher King
quelle
0

Es gibt eine saubere Möglichkeit, die aktuelle URL von einer Razor-Seite oder einer PageModel-Klasse abzurufen. Das ist:

Url.PageLink()

Bitte beachten Sie, dass ich die "ASP.NET Core Razor Pages" meinte, nicht die MVC.

Ich verwende diese Methode, wenn ich das kanonische URL-Meta-Tag auf den ASP.NET Core-Rasierseiten drucken möchte. Aber es gibt einen Haken. Sie erhalten die URL, die die richtige URL für diese Seite sein soll. Lassen Sie mich erklären.

Angenommen, gemäß der Route, die Sie für eine Seite definiert haben, sollte Ihre URL so aussehen

http://www.myWebsite.com/product?id=34

Angenommen, Sie haben eine Route "ID" für Ihre Seite definiert. Url.PageLink () gibt Ihnen also genau diese URL. Wenn der Benutzer dieser URL zusätzliche Elemente hinzufügt, z.

http://www.myWebsite.com/product?id=34&somethingElse

Dann erhalten Sie mit dieser Methode nicht das "SomethingElse". Und deshalb eignet es sich genau zum Drucken von kanonischen URL-Meta-Tags auf der HTML-Seite.

Emran Hussain
quelle