¿Cómo puedo obtener la base del sitio?

183

Quiero escribir un pequeño método auxiliar que devuelva la URL base del sitio. Esto es lo que se me ocurrió:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

¿Hay algún error en esto que se te ocurra? ¿Alguien puede mejorar esto?

Jaggu
fuente

Respuestas:

324

Prueba esto:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";
Frank Allenby
fuente
13
Esta es la única respuesta que he encontrado que se refiere al caso en que un sitio es una aplicación que es hija de un sitio web de nivel superior en IIS.
John
66
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb
2
Request.Url.Scheme no siempre funciona cuando tiene configurada http interna y terminación SSL configurada para https internamente en un servidor, pero ejecuta https * afuera. Para evitar esto, simplemente hice una clave de configuración de aplicaciones específica para el entorno "UrlScheme" con el valor de "http" o "https" en función de dónde reside el sitio web. Se puede acceder a esta configuración en web.config mediante ConfigurationManager.AppSettings ["Key"]
Ben Sewards
3
Esto no tiene en cuenta el equilibrio de carga, donde se produce el descifrado, o reenvía proxies. Puede terminar con una dirección incorrecta usando esto, así que tenga cuidado y sepa dónde se implementó su sitio web.
Conor Gallagher
$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur‌ rent.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penfold
166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

Eso es ;)

Brujo
fuente
25
Esto no funciona para la ruta virtual o de aplicación. Debe usar Request.ApplicationPath además de la parte izquierda.
Brujo
la URL base es httpx: //dominio.com: [puerto] / debe agregar la ruta de la aplicación usted mismo a esta solución
Pawel Cioch
9

La GetLeftPartsolución popular no es compatible con la versión PCL de Uri, desafortunadamente. GetComponentsSin embargo, si necesita portabilidad, esto debería ser el truco:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
Todd Menier
fuente
6

Creo que las respuestas anteriores no tienen en cuenta cuando el sitio no está en la raíz del sitio web.

Este es un controlador para WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
rufo
fuente
Desde un controlador, use Configuration.VirtualPathRoot ya que es independiente del host.
Darrel Miller
5

Para mí, @ warlock parece la mejor respuesta aquí hasta ahora, pero siempre he usado esto en el pasado;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

O en un controlador WebAPI;

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

lo cual es útil para que pueda elegir qué formato de escape desea. No estoy claro por qué hay dos implementaciones tan diferentes, y por lo que puedo decir, este método y @ warlock devuelven exactamente el mismo resultado en este caso, pero parece GetLeftPart()que también funcionaría para las mailtoetiquetas similares de Uri que no son servidores .

cirro
fuente
devuelve una URL no válida para casos en los que está detrás del túnel ngrok y https
Mohammad Zekrallah
5

Este es un método mucho más infalible.

VirtualPathUtility.ToAbsolute("~/");
Daniel A. White
fuente
La llamada de @Daniel no regresará simplemente /si aloja en algún dominio de aplicación, por ejemplo, su servidor / nombre de
vibs2006
@ vibs2006 sí, es una especie de pregunta ambigua
Daniel A. White
4

voy con

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Talha
fuente
1
Esto agregará el protocolo: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee
4

Según lo que escribió Warlock, descubrí que la raíz de la ruta virtual es necesaria si no está alojado en la raíz de su web. (Esto funciona para controladores MVC Web API)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
SpazDude
fuente
1

Estoy usando el siguiente código de Application_Start

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

Crispijn Lange
fuente
1

Esto funciona para mi.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : devuelve la ruta completa igual a la que muestra el navegador.
  • Request.Url.PathAndQuery : devuelve la (ruta completa) - (nombre de dominio + PUERTO).
  • Request.ApplicationPath : devuelve "/" en el servidor alojado y "nombre de la aplicación" en la implementación local de IIS.

Entonces, si desea acceder a su nombre de dominio, considere incluir el nombre de la aplicación en caso de:

  1. Implementación de IIS
  2. Si su aplicación se implementó en el subdominio.

====================================

Para el dev.x.us/web

devuelve este texto fuerte

FAHID
fuente
0

Por favor use el siguiente código                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
Pranav Joseph
fuente
Explique su código para que otros usuarios puedan entender su funcionalidad. ¡Gracias!
Ignacio Ara
-1
 string baseURL = HttpContext.Request.Url.Host;
shebin c babu
fuente
-2

¿podría agregar el puerto para el puerto no 80 / SSL?

algo como:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

y usar eso en el resultado final?

Mark Redman
fuente
66
Request.Url.Authorityincluirá el número de puerto si no es estándar
Andomar