.NET - Obtener protocolo, host y puerto

229

¿Hay una manera simple en .NET para 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 volver:

http://www.mywebsite.com:80

Sé que puedo usar Request.Url.AbsoluteUripara obtener la URL completa, y sé que puedo usar Request.Url.Authoritypara 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?

Jeremy
fuente
1
Vea mi respuesta a una pregunta
similar

Respuestas:

172

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

Uri uri = new Uri("http://www.mywebsite.com:80/pages/page1.aspx");
string requested = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
Almiar
fuente
26
O cadena solicitada = uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
tranmq
17
Podría decirse que esta es la respuesta incorrecta, ya que insertará un ":" incluso cuando no haya puerto. Úselo Uri.GetLeftPartcomo señala @dthrasher
gman
Tenga en cuenta que en algunos casos, aún desea concatenar con uri.Headers ["Host"] en lugar de GetLeftPart (), por ejemplo, detrás de un proxy, su servicio puede estar escuchando en un puerto diferente / no estándar y si usa esa url en una devolución de llamada (con el puerto privado) el host será inalcanzable.
Doveryai
408

Aunque @Rick tiene la respuesta aceptada para esta pregunta, en realidad hay una forma más corta de hacerlo, utilizando el Uri.GetLeftPart()método mal nombrado .

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

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

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

dthrasher
fuente
12
Este es el mejor ejemplo en mi opinión. Funciona para localhost: puerto e instancias en vivo.
The Muffin Man
13
GetLeftPart - realmente, buen nombre de OMG.
Valentin Kuzub
¿Alguien sabe si esta parte de la URL tiene un nombre común usado? En JavaScript se llama Origen, pero no estoy seguro si eso está universalmente acordado: serverfault.com/questions/757494/…
Dirk Boer
1
Microsoft usa el término "Autoridad" para esto, pero no sé si es un término estándar. Ver stackoverflow.com/questions/2142910/…
dthrasher
1
Personalmente no me gusta usar la Uriclase de esta manera. Hay una multitud de casos en los que este constructor arrojará una excepción. Para la mayoría de los casos, prefiero que mi código sea un poco más indulgente antes de abortar la tarea en cuestión.
Jonathan Wood el
60

Bueno, si está haciendo esto en Asp.Net o tiene acceso a HttpContext.Current.Request, diría que estas 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. :)

Holger
fuente
1
Prefiero este método, puedo obtener la pieza que quiero y no tener que preocuparme de si la cadena está bien formada o no para obtener el puerto. +1
Jrud
Algunos detalles más sobre estas propiedades: blog.jonschneider.com/2014/10/…
Jon Schneider
33

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);
Haonan Tan
fuente
23

Request.Url le devolverá el Uri de la solicitud. Una vez que tenga eso, puede recuperar casi cualquier cosa que desee. Para obtener el protocolo, llame a la propiedad Scheme .

Muestra:

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

Espero que esto ayude.

Dale Ragan
fuente
20

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

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

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

Mark Shapiro
fuente
1
Genial, porque funciona en PCL (.GetLeftPart () no está disponible allí)
Sascha
10

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 agarrar LocalHostjunto 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 con éxito agarró: http://localhost:12345

benscabbia
fuente