.NET – Obtenga protocolo, host y puerto

¿Existe una forma sencilla en .NET de obtener rápidamente el protocolo, el host y el puerto actuales? Por ejemplo, si estoy en la siguiente URL:

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

Necesito regresar:

http://www.mywebsite.com:80

Sé que puedo usar Request.Url.AbsoluteUri para obtener la URL completa, y sé que puedo usar Request.Url.Authority para obtener el host y el puerto, pero no estoy seguro de la mejor manera de obtener el protocolo sin analizar la cadena de URL.

¿Alguna sugerencia?

El siguiente código (C #) debería ser el truco

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

A pesar de que @Rick tiene la respuesta aceptada para esta pregunta, en realidad hay una manera más corta de hacerlo, utilizando el mal llamado método Uri.GetLeftPart() .

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

Sin embargo, hay una GetLeftPart() para GetLeftPart() . Si el puerto es el puerto predeterminado para el esquema, lo eliminará. Como el puerto 80 es el puerto predeterminado para http, el resultado de GetLeftPart() en mi ejemplo anterior será http://www.mywebsite.com .

Si el número de puerto hubiera sido distinto de 80, se incluiría en el resultado.

Bueno, si estás haciendo esto en Asp.Net o tienes acceso a HttpContext.Current.Request, diría que estas son formas más fáciles y más generales de obtenerlas:

 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 

Espero que esto ayude. 🙂

Una forma más estructurada de obtener esto es usar UriBuilder. Esto evita la manipulación directa de cadenas.

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

Request.Url te devolverá el Uri de la solicitud. Una vez que tienes eso, puedes recuperar prácticamente todo lo que quieras. Para obtener el protocolo, llame a la propiedad Scheme .

Muestra:

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

Espero que esto ayude.

Aún más corto, puede requerir ASP.Net más nuevo:

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

La enumeración de UriComponents le permite especificar qué componente (s) del URI desea incluir.

Muy similar a la respuesta de Holger. Si necesita tomar la URL puede hacer 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 

La clase Uri proporciona una amplia gama de métodos, muchos de los cuales no he enumerado.

En mi caso, necesitaba tomar LocalHost junto con el Port Number , así que esto es lo que hice:

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

Que exitosamente tomó: http://localhost:12345