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



Respuestas:


324

Prueba esto:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

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


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

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('/') ;

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 .


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


4

voy con

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

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;

1

Estoy usando el siguiente código de Application_Start

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


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


0

Por favor use el siguiente código                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

Explique su código para que otros usuarios puedan entender su funcionalidad. ¡Gracias!
Ignacio Ara


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


66
Request.Url.Authorityincluirá el número de puerto si no es estándar
Andomar
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.