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


Antworten:


120

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

 @Context.Request.Host@Context.Request.Path

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

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()

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 .


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.


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

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

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).


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:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.