.NET: ottieni protocollo, host e porta


229

Esiste un modo semplice in .NET di ottenere rapidamente il protocollo, l'host e la porta correnti? Ad esempio, se mi trovo sul seguente URL:

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

Devo tornare:

http://www.mywebsite.com:80

So che posso usare Request.Url.AbsoluteUriper ottenere l'URL completo e so che posso usare Request.Url.Authorityper ottenere l'host e la porta, ma non sono sicuro del modo migliore per ottenere il protocollo senza analizzare la stringa dell'URL.

Eventuali suggerimenti?


1
Vedere la mia risposta a una domanda simlar qui - stackoverflow.com/a/1534478/98740
WDuffy

Risposte:


172

Il seguente codice (C #) dovrebbe fare il trucco

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

26
O stringa richiesta = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq,

17
Questa è probabilmente la risposta sbagliata in quanto inserirà un ":" anche quando non c'è porta. Usa Uri.GetLeftPartcome indica @dthrasher
gman

Si noti che in alcuni casi, si desidera comunque concatenarsi con uri.Headers ["Host"] anziché GetLeftPart (), ad esempio dietro un proxy, il servizio potrebbe essere in ascolto su una porta diversa / non standard e se si utilizza quell'URL in un callback (con la porta privata) l'host sarà irraggiungibile.
Doveryai,

408

Anche se @Rick ha la risposta accettata per questa domanda, in realtà c'è un modo più breve per farlo, usando il Uri.GetLeftPart()metodo mal chiamato .

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

C'è un problema GetLeftPart(), tuttavia. Se la porta è la porta predefinita per lo schema, la rimuoverà. Poiché la porta 80 è la porta predefinita per http, l'output di GetLeftPart()nel mio esempio sopra saràhttp://www.mywebsite.com .

Se il numero di porta fosse stato diverso da 80, sarebbe stato incluso nel risultato.


12
Questo è il miglior esempio secondo me. Funziona per localhost: port e istanze live.
The Muffin Man,

13
GetLeftPart - davvero, bella denominazione OMG.
Valentin Kuzub,

Qualcuno sa se questa parte dell'URL ha un nome usato comune? In JavaScript si chiama Origin, ma non sono sicuro che sia universalmente concordato su: serverfault.com/questions/757494/…
Dirk Boer,

1
Microsoft usa il termine "Autorità" per questo, ma non so se sia un termine standard. Vedere stackoverflow.com/questions/2142910/...
dthrasher

1
Personalmente non mi piace usare la Uriclasse in questo modo. Ci sono molti casi in cui questo costruttore genererà un'eccezione. Nella maggior parte dei casi, preferisco che il mio codice sia un po 'più tollerante prima di interrompere l'attività in corso.
Jonathan Wood,

60

Bene, se lo stai facendo in Asp.Net o hai accesso a HttpContext.Current.Request direi che questi sono modi più semplici e più generali per ottenerli:

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

Spero che aiuti. :)


1
Preferisco questo metodo, posso ottenere solo la pezza che voglio e non devo preoccuparmi se la stringa è abbastanza ben formata per ottenere la porta. +1
Jrud,

Alcuni maggiori dettagli su queste proprietà: blog.jonschneider.com/2014/10/…
Jon Schneider

33

Un modo più strutturato per ottenere ciò è usare UriBuilder. Questo evita la manipolazione diretta delle stringhe.

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

23

Request.Url ti restituirà l' Uri della richiesta. Una volta che lo hai, puoi recuperare praticamente tutto quello che vuoi. Per ottenere il protocollo, chiamare la proprietà Scheme .

Campione:

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

Spero che questo ti aiuti.


20

Anche in modo più breve, potrebbe essere necessario ASP.Net più recente:

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

L'enum UriComponents ti consente di specificare quali componenti dell'URI vuoi includere.


1
Fantastico, perché funziona in PCL (.GetLeftPart () non è disponibile lì)
Sascha,

10

Molto simile alla risposta di Holger. Se hai bisogno di afferrare l'URL puoi fare qualcosa del tipo:

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

La classe Uri offre un'intera gamma di metodi, molti dei quali non li ho elencati.

Nel mio caso, avevo bisogno di afferrare LocalHostinsieme a Port Number, quindi questo è quello che ho fatto:

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

Che ha afferrato con successo: http://localhost:12345

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.