.NET: obtenga protocolo, host y puerto
Pregunta
¿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 cuál es la mejor manera de obtener el protocolo sin analizar la cadena URL.
¿Alguna sugerencia?
Solución
El siguiente código (C#) debería funcionar
Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Otros consejos
Aunque @Rick tiene la respuesta aceptada para esta pregunta, en realidad hay una manera más corta de hacerlo, usando el mal llamado Uri.GetLeftPart()
método.
Uri url = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string output = url.GetLeftPart(UriPartial.Authority);
Hay un problema GetLeftPart()
, sin embargo.Si el puerto es el puerto predeterminado para el esquema, lo eliminará.Dado que el puerto 80 es el puerto predeterminado para http, la salida 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á haciendo esto en ASP.NET o tiene acceso a httpcontext.current.request, diría que son formas más fáciles y más generales de obtenerlos:
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 conseguirlo es utilizar UriBuilder.Esto evita la manipulación directa de cadenas.
var builder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port);
Una forma aún más corta, puede requerir ASP.Net más nuevo:
string authority = Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)
La enumeración UriComponents le permite especificar qué componentes del URI desea incluir.
Muy similar a la respuesta de Holger.Si necesita obtener 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
El clase uri proporciona una amplia gama de métodos, muchos de los cuales no he enumerado.
En mi caso, necesitaba agarrar LocalHost
junto con Port Number
, entonces esto es lo que hice:
var Uri uri = Context.Request.Url;
var host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Que agarró con éxito: http://localhost:12345