2008-08-22 8 views
181

Gibt es einen einfachen Weg in .NET, um das aktuelle Protokoll, Host und Port schnell zu erhalten? Zum Beispiel, wenn ich auf die folgende URL bin:.NET - Protokoll, Host und Port abrufen

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

Ich muss zurück:

http://www.mywebsite.com:80

Ich weiß, ich Request.Url.AbsoluteUri können die vollständige URL zu bekommen, und ich weiß, Ich kann Request.Url.Authority verwenden, um den Host und den Port abzurufen, aber ich bin mir nicht sicher, wie ich das Protokoll am besten beschaffen kann, ohne die URL-Zeichenfolge zu analysieren.

Irgendwelche Vorschläge?

+0

Request.AbsoluteURI –

+1

Siehe meine Antwort auf eine simlar Frage hier - http://StackOverflow.com/a/1534478/98740 – WDuffy

Antwort

138

Der folgende (C#) Code sollte es tun

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

Oder Zeichenfolge angefordert = uri.Scheme + Uri.SchemeDelimiter + uri.Authority; – tranmq

+11

Dies ist wohl die falsche Antwort, da ein ":" eingefügt wird, auch wenn kein Port vorhanden ist. Benutze 'Uri.GetLeftPart' als @dthrasher zeigt – gman

20

Request.Url gibt Ihnen die 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 zu erhalten.

Probe:

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

Hoffnung, das hilft.

339

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

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

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

Wenn die Portnummer etwas anderes als 80 war, würde sie im Ergebnis enthalten sein.

+10

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

+0

Zustimmen +1, weil es localhost funktioniert: Port –

+8

GetLeftPart - wirklich, OMG nette Benennung. –

46

Nun, wenn Sie diese in Asp.Net tun oder den Zugang zu HttpContext.Current.Request haben Ich würde sagen, das ist einfacher und allgemeine Möglichkeiten, sie zu bekommen:

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 nur das gewünschte Stück bekommen und muss mir keine Sorgen machen, ob die Saite gut genug geformt ist, um den Anschluss zu bekommen. +1 – Jrud

+0

Einige weitere Details zu diesen Eigenschaften: http://blog.jonschneider.com/2014/10/systemuri-net-framework-45-visual-guide.html –

23

Ein strukturierterer Weg, um dies zu erreichen, ist die Verwendung von UriBuilder. Dies vermeidet direkte String-Manipulation.

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

Noch kürzere Weg, erfordern neuere ASP.Net:

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

Die UriComponents Enum Sie welche Komponente (n) der URI Sie einbeziehen möchten, angeben können.

+1

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

7

Sehr ähnlich zu Holgers Antwort. Wenn Sie die URL greifen, wie etwas 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 class bietet eine ganze Reihe von Methoden, viele, die ich nicht aufgeführt.

In meinem Fall musste ich LocalHost zusammen mit dem Port Number greifen, so ist dies, was ich tat:

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

erfolgreich packte: http://localhost:12345

Verwandte Themen