Wie erhalte ich die vollständige URL der Seite, auf der ich mich in C # befinde?

163

Ich muss in der Lage sein, über ein Benutzersteuerelement auf die vollständige URL der Seite zuzugreifen, auf der ich mich befinde. Geht es nur darum, eine Reihe von Anforderungsvariablen miteinander zu verketten? Wenn ja, welche? Oder gibt es einen einfacheren Weg?

RedWolves
quelle
5
Für alle in einer Webfarm mit Lastenausgleich. Achten Sie auf die Portnummer, die bei Verwendung von System.Url angezeigt wird: stackoverflow.com/questions/7674850/…
felickz

Antworten:

155

Normalerweise verwende ich Request.Url.ToString(), um die vollständige URL (einschließlich Querystring) zu erhalten, ohne dass eine Verkettung erforderlich ist.

Travis
quelle
2
Wenn die URL '#' enthält, werden nicht alle Zeichen nach # eingeschlossen.
Krunal Sisodiya
5
@KrunalSisodiya Ich glaube nicht, dass der Hash einer URL jemals an den Server gesendet wird, aber ich könnte mich irren.
Travis
Request.Url.ToString()ist nicht enthalten queryString.
Yogesh Patel
320

Hier ist eine Liste, auf die ich mich normalerweise für diese Art von Informationen beziehe:

Request.ApplicationPath :   /virtual_dir
Request.CurrentExecutionFilePath :  /virtual_dir/webapp/page.aspx
Request.FilePath :  /virtual_dir/webapp/page.aspx
Request.Path :  /virtual_dir/webapp/page.aspx
Request.PhysicalApplicationPath :   d:\Inetpub\wwwroot\virtual_dir\
Request.QueryString :   /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.AbsolutePath :  /virtual_dir/webapp/page.aspx
Request.Url.AbsoluteUri :   http://localhost:2000/virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Host :  localhost
Request.Url.Authority : localhost:80
Request.Url.LocalPath : /virtual_dir/webapp/page.aspx
Request.Url.PathAndQuery :  /virtual_dir/webapp/page.aspx?q=qvalue
Request.Url.Port :  80
Request.Url.Query : ?q=qvalue
Request.Url.Scheme :    http
Request.Url.Segments :  /
    virtual_dir/
    webapp/
    page.aspx

Hoffentlich finden Sie dies nützlich!

Mohsen
quelle
1
1) Es gibt auch Request.RawUrl; 2) Request.Url kann eine Ausnahme für 'sehr schlecht angeforderte Pfade' auslösen.
user2864740
Sehr hilfreiche Antwort, aber sollten die Portnummern nicht konsistent sein, um Verwirrung zu vermeiden (vorausgesetzt, alle Beispiele beziehen sich auf dieselbe Anfrage? ZB implizieren Autorität und Port Port 80, aber AbsoluteUri enthält Port 2000)
Young Bob
Request.QueryStringkehrt q=qvaluenur zurück
Marcel
74
Request.Url.AbsoluteUri

Diese Eigenschaft erledigt alles, was Sie brauchen, alles in einem kurzen Aufruf.

Entwicklung von Chris
quelle
6
+1. Dies ist die beste Antwort. Sollte Request.Url.ToString () vorgezogen werden.
Todd Menier
10

Denn ASP.NET CoreSie müssen es buchstabieren:

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

Oder Sie können Ihrer Ansicht eine using-Anweisung hinzufügen:

@using Microsoft.AspNetCore.Http.Extensions

dann

@Context.Request.GetDisplayUrl()

Das _ViewImports.cshtmlkönnte ein besserer Ort dafür sein@using

Serj Sagan
quelle
1
Vielen Dank. Das hat geholfen!
FlyingV
9

Request.RawUrl

FlySwat
quelle
7
Dies gibt nicht die vollständige URL zurück. Wenn die vollständige URL blah.com/1.1/home/main?a=1 lautet, wird Request.RawUrl 1.1 / hom / main? A = 1
jnoreiga
9

Wenn Sie die vollständige URL vom http bis zum Querystring benötigen, müssen Sie die folgenden Variablen verketten

Request.ServerVariables("HTTPS") // to check if it's HTTP or HTTPS
Request.ServerVariables("SERVER_NAME") 
Request.ServerVariables("SCRIPT_NAME") 
Request.ServerVariables("QUERY_STRING")
Christian Hagelid
quelle
2
Dies berücksichtigt nicht nicht standardmäßige Ports (dh nicht Port 80 für http verwenden)
Spongeboy
1
Sie können Request.ServerVariables ("SERVER_PORT") zur Porterkennung verwenden!
Armen
1
Beachten Sie, dass diese Antwort die VB.Net-Syntax verwendet. Verwenden Sie in C # beispielsweise Request.ServerVariables ["HTTPS"].
Jaycer
7

Besser zu bedienen Request.Url.OriginalStringals Request.Url.ToString()(laut MSDN )

Eni
quelle
Es ist nur besser, wenn Sie wirklich die Originalzeichenfolge benötigen.
Dirk
@DirkThe from-Link zu MSDN oben: "Die von der ToString-Methode zurückgegebene Zeichenfolge kann Steuerzeichen enthalten, die den Status einer Konsolenanwendung beschädigen können. Sie können die GetComponents-Methode mit dem Format UriFormat.SafeUnescaped verwenden, um Steuerzeichen aus der zurückgegebenen Zeichenfolge zu entfernen . "
Eni
Genau, und das hat nichts damit zu tun OriginalString.
Dirk
5

Vielen Dank, ich habe eine Kombination Ihrer beiden Antworten @Christian und @Jonathan für meine spezifischen Bedürfnisse verwendet.

"http://" + Request.ServerVariables["SERVER_NAME"] +  Request.RawUrl.ToString()

Ich muss mich nicht um sichere http kümmern, brauchte die Servername-Variable und die RawUrl behandelt den Pfad vom Domain-Namen und enthält den Querystring, falls vorhanden.

RedWolves
quelle
2
Sie sollten auch wissen, dass RawUrl im Gegensatz zu Request.Url die ursprüngliche, nicht zugeordnete Anforderungs-URL darstellt, wenn die URL-Zuordnung verwendet wird.
Harpo
SERVER_NAME gibt häufig nicht die vom Client verwendete "echte" URL zurück. HTTP_HOST ist wahrscheinlich die bessere Form, wenn Sie direkt eingreifen möchten. Außerdem fehlt einfaches HTTP-zu-einem-anderen-Port.
user2864740
1

Wenn Sie auch die Portnummer benötigen, können Sie verwenden

Request.Url.Authority

Beispiel:

string url = Request.Url.Authority + HttpContext.Current.Request.RawUrl.ToString();

if (Request.ServerVariables["HTTPS"] == "on")
{
    url = "https://" + url;
}
else 
{
    url = "http://" + url;
}
IonB
quelle
1

Versuche Folgendes -

var FullUrl = Request.Url.AbsolutePath.ToString();
var ID = FullUrl.Split('/').Last();
Abhishek Kanrar
quelle