.NET - Uzyskaj protokół, host i port

228

Czy w .NET istnieje prosty sposób szybkiego uzyskania bieżącego protokołu, hosta i portu? Na przykład, jeśli mam następujący adres URL:

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

Muszę zwrócić:

http://www.mywebsite.com:80

Wiem, że mogę użyć, Request.Url.AbsoluteUriaby uzyskać pełny adres URL, i wiem, że mogę użyć, Request.Url.Authorityaby uzyskać hosta i port, ale nie jestem pewien, jak najlepiej uzyskać protokół bez analizowania ciągu adresu URL.

Jakieś sugestie?

Jeremy
źródło
1
Zobacz moją odpowiedź na proste pytanie tutaj - stackoverflow.com/a/1534478/98740
WDuffy

Odpowiedzi:

172

Poniższy kod (C #) powinien załatwić sprawę

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Stóg
źródło
26
Lub ciąg żądany = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq
17
Jest to prawdopodobnie zła odpowiedź, ponieważ wstawi „:”, nawet jeśli nie ma portu. Użyj, Uri.GetLeftPartjak wskazuje @dthrasher
gman
Pamiętaj, że w niektórych przypadkach nadal chcesz łączyć się z uri.Headers [„Host”] zamiast GetLeftPart (), np. Za serwerem proxy usługa może nasłuchiwać na innym / niestandardowym porcie, a jeśli używasz tego adresu URL w wywołanie zwrotne (z prywatnym portem) host będzie nieosiągalny.
doveryai
408

Chociaż @Rick ma zaakceptowaną odpowiedź na to pytanie, istnieje w rzeczywistości krótszy sposób, aby to zrobić, używając źle nazwanej Uri.GetLeftPart()metody.

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

Jest jednak jeden haczyk GetLeftPart(). Jeśli port jest domyślnym portem dla schematu, usunie go. Ponieważ port 80 jest domyślnym portem dla protokołu http, GetLeftPart()w powyższym przykładzie będzie to wynik wyjściowyhttp://www.mywebsite.com .

Gdyby numer portu był inny niż 80, zostałby uwzględniony w wyniku.

dthrasher
źródło
12
To moim zdaniem najlepszy przykład. Działa dla localhost: port i instancje na żywo.
The Muffin Man,
13
GetLeftPart - naprawdę fajne nazewnictwo OMG.
Valentin Kuzub
Czy ktoś wie, czy ta część adresu URL ma powszechnie używaną nazwę? W JavaScript nazywa się Origin, ale nie jestem pewien, czy jest to powszechnie uzgodnione: serverfault.com/questions/757494/…
Dirk Boer
1
Microsoft używa do tego terminu „władza”, ale nie wiem, czy jest to termin standardowy. Zobacz stackoverflow.com/questions/2142910/…
dthrasher
1
Osobiście nie lubię korzystać z Uriklasy w ten sposób. Istnieje wiele przypadków, w których ten konstruktor zgłosi wyjątek. W większości przypadków wolę, aby mój kod był trochę bardziej wyrozumiały przed przerwaniem bieżącego zadania.
Jonathan Wood
60

Cóż, jeśli robisz to w Asp.Net lub masz dostęp do HttpContext.Current.Request Powiedziałbym, że są to łatwiejsze i bardziej ogólne sposoby ich uzyskania:

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

Mam nadzieję, że to pomoże. :)

Holger
źródło
1
Wolę tę metodę, mogę uzyskać tylko taki kawałek, jaki chcę i nie muszę się martwić, czy łańcuch jest odpowiednio uformowany, aby uzyskać port. +1
Jrud
Więcej informacji na temat tych właściwości: blog.jonschneider.com/2014/10/…
Jon Schneider
33

Bardziej uporządkowanym sposobem uzyskania tego jest użycie UriBuilder. Pozwala to uniknąć bezpośredniej manipulacji ciągiem.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Haonan Tan
źródło
23

Request.Url zwróci Ci Uri żądania. Gdy już to zrobisz, możesz odzyskać prawie wszystko, co chcesz. Aby uzyskać protokół, zadzwoń do schematu właściwość .

Próba:

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

Mam nadzieję że to pomoże.

Dale Ragan
źródło
20

Jeszcze krótszy sposób może wymagać nowszej ASP.Net:

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

Wyliczanie UriComponents pozwala określić, które składniki URI mają zostać uwzględnione.

Mark Shapiro
źródło
1
Świetnie, ponieważ działa w PCL (.GetLeftPart () tam nie jest dostępny)
Sascha
10

Bardzo podobny do odpowiedzi Holgera. Jeśli chcesz pobrać adres URL, możesz zrobić coś takiego:

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

Klasa Uri zapewnia całą gamę metod, których wiele nie mam na liście.

W moim przypadku, musiałem chwycić LocalHostwraz z Port Number, więc to, co zrobiłem:

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

Które pomyślnie złapał: http://localhost:12345

benscabbia
źródło