.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?


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;

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.


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. :)


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);

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.


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.