Obter protocolo, host e porta

229

Existe uma maneira simples no .NET de obter rapidamente o protocolo, host e porta atuais? Por exemplo, se eu estiver no seguinte URL:

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

Eu preciso retornar:

http://www.mywebsite.com:80

Sei que posso usar Request.Url.AbsoluteUripara obter a URL completa e sei que posso usar Request.Url.Authoritypara obter o host e a porta, mas não tenho certeza da melhor maneira de obter o protocolo sem analisar a string da URL.

Alguma sugestão?

Jeremy
fonte
1
Veja a minha resposta a uma pergunta simlar aqui - stackoverflow.com/a/1534478/98740
WDuffy

Respostas:

172

O código a seguir (C #) deve fazer o truque

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Rick
fonte
26
Ou sequência solicitada = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq
17
Esta é sem dúvida a resposta errada, pois inserirá um ":" mesmo quando não houver porta. Use Uri.GetLeftPartcomo @dthrasher aponta
gman
Observe que, em alguns casos, você ainda deseja concatenar com uri.Headers ["Host"] em vez de GetLeftPart (); por exemplo, atrás de um proxy, seu serviço pode estar ouvindo em uma porta diferente / não padrão e, se você usar esse URL em um retorno de chamada (com a porta privada) o host estará inacessível.
doveryai
408

Mesmo que o @Rick tenha a resposta aceita para essa pergunta, na verdade há uma maneira mais curta de fazer isso, usando o Uri.GetLeftPart()método com nomes inadequados .

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

Há um problema GetLeftPart(), no entanto. Se a porta for a porta padrão do esquema, ela será removida. Como a porta 80 é a porta padrão para http, a saída do GetLeftPart()meu exemplo acima será http://www.mywebsite.com.

Se o número da porta tivesse sido diferente de 80, seria incluído no resultado.

dthrasher
fonte
12
Este é o melhor exemplo na minha opinião. Funciona para localhost: porta e instâncias ativas.
The Muffin Man
13
GetLeftPart - realmente, OMG, boa nomeação.
Valentin Kuzub 18/03/2015
Alguém sabe se esta parte do URL tem um nome usado comum? Em JavaScript que é chamado de origem, mas não tenho certeza se isso é universalmente aceito em: serverfault.com/questions/757494/...
Dirk Boer
1
A Microsoft usa o termo "Autoridade" para isso, mas não sei se esse é um termo padrão. Veja stackoverflow.com/questions/2142910/…
dthrasher
1
Eu pessoalmente não gosto de usar a Uriclasse dessa maneira. Há vários casos em que esse construtor lança uma exceção. Na maioria dos casos, prefiro que meu código seja um pouco mais perdoador antes de interromper a tarefa em questão.
Jonathan Wood
60

Bem, se você estiver fazendo isso no Asp.Net ou tiver acesso ao HttpContext.Current.Request, eu diria que essas são maneiras mais fáceis e gerais de obtê-los:

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

Eu espero que isso ajude. :)

Holger
fonte
1
Eu prefiro esse método, posso obter apenas o valor que desejo e não preciso me preocupar se a string está ou não formada o suficiente para obter a porta. 1
Jrud 2/11
Mais alguns detalhes sobre essas propriedades: blog.jonschneider.com/2014/10/…
Jon Schneider
33

Uma maneira mais estruturada de obter isso é usar o UriBuilder. Isso evita a manipulação direta de strings.

var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Haonan Tan
fonte
23

Request.Url retornará o Uri da solicitação. Depois de ter isso, você pode recuperar praticamente tudo o que quiser. Para obter o protocolo, chame a propriedade Scheme .

Amostra:

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

Espero que isto ajude.

Dale Ragan
fonte
20

De maneira ainda mais curta, pode exigir o ASP.Net mais recente:

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

A enumeração UriComponents permite especificar quais componentes do URI você deseja incluir.

Mark Shapiro
fonte
1
Grande, porque funciona em PCL (.GetLeftPart () istn't disponíveis lá)
Sascha
10

Muito parecido com a resposta de Holger. Se você precisar pegar o URL, pode fazer algo como:

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

A classe Uri fornece toda uma gama de métodos, muitos dos quais não listei.

No meu exemplo, eu precisava pegar LocalHostjunto com o Port Number, então é isso que eu fiz:

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

Que pegou com sucesso: http://localhost:12345

benscabbia
fonte