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

Jeremy
quelle
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;
Rick
quelle
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.

dthrasher
quelle
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. :) :)

Holger
quelle
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);
Haonan Tan
quelle
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.

Dale Ragan
quelle
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.

Mark Shapiro
quelle
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

Benscabbia
quelle