2008-09-15 9 views
92

Me pregunto cuál es la mejor manera de obtener el dominio actual en ASP.NET?¿Cuál es el mejor método en ASP.NET para obtener el dominio actual?

Por ejemplo:

http://www.domainname.com/subdir/ debe producir http://www.domainname.com http://www.sub.domainname.com/subdir/ debe ceder http://sub.domainname.com

Como guía, debería ser capaz de añadir una URL como "/Folder/Content/filename.html" (digamos como generado por Url.RouteUrl() en ASP.NET MVC) directamente en la URL y debería funcionar.

+3

Tenga en cuenta que el "dominio actual" aquí es en realidad lo que el usuario-agente utilizado para llegar a su sitio, que en muchos casos es diferente de la "URL oficial" de su sitio, así como lo que el usuario final puede haber ingresado en su navegador (proxy inverso, proxy directo, nombre de host interno, IP dirección, ...). – bzlm

+1

Entonces, ¿hay alguna manera de obtener la "URL oficial" (la de IIS?) –

Respuesta

166

La misma respuesta que MattMitchell de, pero con algunas modificaciones. Esto comprueba el puerto predeterminado en su lugar.

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + 
(Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port) 
+3

¿Hay un campo definido i .NET que pueda usar en lugar de ":"? Algo así como System.Uri.PortDelimiter? Ya sabes, solo por coherencia. :) –

+2

No es que yo sepa, Jan Aagaard, pero siempre puedes hacer uno localmente. Lo hago para la mayoría de las cadenas y números "mágicos". Para ese asunto, entonces usaría string.Empty en lugar de "" en la respuesta de Carlos;) – vbullinger

+8

Puede usar 'Request.Url.Authority' como sugirió Korayem en lugar de' Request.Url.Host' y 'Request.Url .Port'. – Schmalls

34

Según this link un buen punto de partida es:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

Sin embargo, si el dominio es http://www.domainname.com:500 esta fallará.

algo como lo siguiente es tentador para resolver esto:

int defaultPort = Request.IsSecureConnection ? 443 : 80; 
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
    + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : ""); 

Sin embargo, el puerto 80 y 443 dependerá de la configuración.

Como tal, debe usar IsDefaultPort como en el Accepted Answer anterior de Carlos Muñoz.

+1

¿Por qué suponer el puerto 80 aquí? Si elimina esa suposición, el código se ve como un comodín. Cuando asume el puerto 80, fallará en muchos escenarios (vea comentarios en otros torres). Si desea eliminar el número de puerto si es posible, debe verificar que el número de puerto sea el predeterminado para el esquema en cuestión y que el esquema sea compatible con los números de puerto predeterminados. – bzlm

+0

Sí, vea la nota de que el puerto 80 puede ser una mala idea. No sé de ninguna otra forma, pero es por eso que mencioné que tendrá que depender de la configuración. –

+1

No sé si esto ayudará o no, pero también podría intentarlo si Request.IsSecureConnection determina si se usa HTTPS o no. –

-1

¿Qué tal:

String domain = "http://" + Request.Url.Host 
+0

No está mal, pero ¿y si su sitio tiene páginas seguras, es decir, https: // ¿Qué sucede si su dominio no está alojado en el puerto 80? –

0

¿Qué tal:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables; 
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://"; 
string domain = vars["SERVER_NAME"]; 
string port = vars["SERVER_PORT"]; 
0

Otra forma:


string domain; 
Uri url = HttpContext.Current.Request.Url; 
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty); 
18

ADVERTENCIA! Para cualquiera que use Current.Request .Url.Host. Comprenda que está trabajando según la PETICIÓN ACTUAL y que la solicitud actual NO SIEMPRE estará con su servidor y que a veces puede estar con otros servidores.

Así que si utiliza esto en algo así como, Application_BeginRequest() en Global.asax, entonces el 99.9% de las veces va a estar bien, pero el 0.1% podría obtener algo más que el nombre de host de su propio servidor.

Un buen ejemplo de esto es algo que descubrí no hace mucho tiempo. Mi servidor tiende a golpear http://proxyjudge1.proxyfire.net/fastenv de vez en cuando. Application_BeginRequest() maneja con gusto esta solicitud, por lo que si llama a Request.Url.Host cuando realiza esta solicitud, obtendrá de nuevo proxyjudge1.proxyfire.net. Algunos de ustedes podrían estar pensando "no duh", pero vale la pena señalarlo porque fue un error muy difícil de notar ya que solo ocurrió el 0.1% del tiempo: P

Este error me ha obligado a insertar el host de mi dominio como una cadena en los archivos de configuración

+0

hizo exactamente lo mismo. Mi dominio está en web.config ahora. – Korayem

+0

i _think_ lo entiendo, ¿por qué su servidor golpea proxyfire? ¿Es ese tu sitio? Pero, en general, tiene sentido: el uso de un objeto específico de la solicitud durante un evento específico de la aplicación puede no funcionar demasiado bien. ¿Hay algún peligro en un evento específico de la solicitud, como un evento del ciclo de vida de la página (Page.LoadCompleted, etc.)? – mlhDev

+0

No investigué demasiado sobre por qué se estaba resolviendo proxyfire. Ciertamente no era mi sitio, pero sí me indicó que Current.Request.Url no era 100% confiable.Después de una gran cantidad de investigaciones, también descubrí que la determinación dinámica de su nombre de host no es fácil, debido a múltiples tarjetas de NIC, IP y nombres de dominio que se resuelven en la misma IP. En cuanto a su otra pregunta, Matt, no estoy seguro de lo que quiere decir: ( – Thirlan

12

Por qué no usar

Request.Url.Authority

Devuelve todo el dominio y el puerto.

usted todavía tiene que averiguar HTTP o HTTPS

+1

Esto también funciona. Para "figurar" http o https, simlpy put "// "antes que. Así que, por ejemplo, se leería como href =" // @ Request.Url.Authority ... " – EdwardM

23
Request.Url.GetLeftPart(UriPartial.Authority) 

Este esquema está incluido.

+16

Me encantaría haber estado en la reunión cuando se les ocurrió ese nombre –

0

Usando UriBuilder:

var relativePath = ""; // or whatever-path-you-want 
    var uriBuilder = new UriBuilder 
    { 
     Host = Request.Url.Host, 
     Path = relativePath, 
     Scheme = Request.Url.Scheme 
    }; 

    if (!Request.Url.IsDefaultPort) 
     uriBuilder.Port = Request.Url.Port; 

    var fullPathToUse = uriBuilder.ToString(); 
0

simple y camino corto (Él ayuda del esquema, dominio y puerto):

var MyUri= Request.UrlReferrer; 

// Use this like: 
Var fullDomain = myUri.Scheme + Uri.SchemeDelimiter + myUri.Authority; 

// Example output: https://www.example.com:5031 
// Example output: http://www.example.com:5031 
// Example output: https://www.example.com 
Cuestiones relacionadas