.NET - Protokoll, Host und Port abrufen


228

Gibt es in .NET eine einfache Möglichkeit, das aktuelle Protokoll, den Host und den Port schnell abzurufen? Zum Beispiel, wenn ich unter der folgenden URL bin:

http://www.mywebsite.com:80/pages/page1.aspx

Ich muss zurückkehren:

http://www.mywebsite.com:80

Ich weiß, dass ich Request.Url.AbsoluteUridie vollständige URL abrufen kann, und ich weiß, dass ich Request.Url.Authorityden Host und den Port abrufen kann, aber ich bin mir nicht sicher, wie ich das Protokoll am besten abrufen kann, ohne die URL-Zeichenfolge zu analysieren.

Irgendwelche Vorschläge?


1
Siehe meine Antwort auf eine ähnliche Frage hier - stackoverflow.com/a/1534478/98740
WDuffy

Antworten:


172

Der folgende (C #) Code sollte den Trick machen

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

26
Oder Zeichenfolge angefordert = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
Tranmq

17
Dies ist wohl die falsche Antwort, da ein ":" eingefügt wird, auch wenn kein Port vorhanden ist. Verwendung Uri.GetLeftPartals @dthrasher weist darauf hin
gman

Beachten Sie, dass Sie in einigen Fällen immer noch mit uri.Headers ["Host"] anstelle von GetLeftPart () verketten möchten, z. B. hinter einem Proxy, dass Ihr Dienst möglicherweise einen anderen / nicht standardmäßigen Port überwacht und wenn Sie diese URL in verwenden Bei einem Rückruf (mit dem privaten Port) ist der Host nicht erreichbar.
Doveryai

408

Obwohl @Rick die akzeptierte Antwort auf diese Frage hat, gibt es tatsächlich einen kürzeren Weg, dies mit der schlecht benannten Uri.GetLeftPart()Methode zu tun .

Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);

Es gibt jedoch einen Haken GetLeftPart(). Wenn der Port der Standardport für das Schema ist, wird er entfernt. Da Port 80 der Standardport für http ist, wird GetLeftPart()in meinem obigen Beispiel die Ausgabe von ausgeführt http://www.mywebsite.com.

Wenn die Portnummer nicht 80 gewesen wäre, wäre sie im Ergebnis enthalten.


12
Dies ist meiner Meinung nach das beste Beispiel. Es funktioniert für localhost: Port- und Live-Instanzen.
Der Muffin-Mann

13
GetLeftPart - wirklich, OMG nette Benennung.
Valentin Kuzub

Weiß jemand, ob dieser Teil der URL einen gebräuchlichen Namen hat? In JavaScript heißt es Origin, aber ich bin mir nicht sicher, ob dies allgemein vereinbart ist: serverfault.com/questions/757494/…
Dirk Boer

1
Microsoft verwendet hierfür den Begriff "Autorität", aber ich weiß nicht, ob dies ein Standardbegriff ist. Siehe stackoverflow.com/questions/2142910/…
dthrasher

1
Ich persönlich mag es nicht, die UriKlasse so zu benutzen . Es gibt eine Vielzahl von Fällen, in denen dieser Konstruktor eine Ausnahme auslöst. In den meisten Fällen bevorzuge ich, dass mein Code etwas verzeihender ist, bevor die jeweilige Aufgabe abgebrochen wird.
Jonathan Wood

60

Wenn Sie dies in Asp.Net tun oder Zugriff auf HttpContext.Current.Request haben, würde ich sagen, dass dies einfachere und allgemeinere Methoden sind, um sie zu erhalten:

var scheme = Request.Url.Scheme; // will get http, https, etc.
var host = Request.Url.Host; // will get www.mywebsite.com
var port = Request.Url.Port; // will get the port
var path = Request.Url.AbsolutePath; // should get the /pages/page1.aspx part, can't remember if it only get pages/page1.aspx

Ich hoffe das hilft. :) :)


1
Ich bevorzuge diese Methode, ich kann genau das bekommen, was ich will, und muss mir keine Sorgen machen, ob die Saite gut genug geformt ist, um den Port zu bekommen. +1
Jrud

Einige weitere Details zu diesen Eigenschaften: blog.jonschneider.com/2014/10/…
Jon Schneider

33

Eine strukturiertere Möglichkeit, dies zu erreichen, ist die Verwendung von UriBuilder. Dies vermeidet eine direkte Manipulation der Zeichenfolge.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);

23

Request.Url gibt Ihnen den Uri der Anfrage zurück. Sobald Sie das haben, können Sie so ziemlich alles abrufen, was Sie wollen. Rufen Sie die Scheme- Eigenschaft auf, um das Protokoll abzurufen .

Stichprobe:

Uri url = Request.Url;
string protocol = url.Scheme;

Hoffe das hilft.


20

Für einen noch kürzeren Weg ist möglicherweise ein neueres ASP.Net erforderlich:

string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)

In der UriComponents-Enumeration können Sie angeben, welche Komponente (n) des URI Sie einschließen möchten.


1
Großartig, weil es in PCL funktioniert (.GetLeftPart () ist dort nicht verfügbar)
Sascha

10

Sehr ähnlich zu Holgers Antwort. Wenn Sie die URL abrufen müssen, können Sie Folgendes tun:

Uri uri = Context.Request.Url;         
var scheme = uri.Scheme // returns http, https
var scheme2 = uri.Scheme + Uri.SchemeDelimiter; // returns http://, https://
var host = uri.Host; // return www.mywebsite.com
var port = uri.Port; // returns port number

Die Uri-Klasse bietet eine ganze Reihe von Methoden, von denen ich viele nicht aufgelistet habe.

In meinem Fall musste ich mich LocalHostan die halten Port Number, also habe ich Folgendes getan:

var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 

Welche erfolgreich ergriffen: http://localhost:12345

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.