¿Cómo puedo obtener el URI del dominio raíz en ASP.NET?

96

Digamos que tengo un sitio web en http://www.foobar.com .

¿Hay alguna forma de determinar mediante programación " http://www.foobar.com/ " en mi código subyacente (es decir, sin tener que codificarlo en mi configuración web)?

núcleo
fuente
7
Dado que eso depende de la solicitud, puede intentar buscar en el Requestobjeto.
John Saunders

Respuestas:

79

HttpContext.Current.Request.Url puede obtener toda la información sobre la URL. Y puede dividir la URL en fragmentos.

JoshBerke
fuente
4
Sí, ¿por qué el voto negativo? No vea algo marcado como la respuesta y que se haya votado negativamente a menudo. : /
Zack
4
Tampoco me gusta esta respuesta. blesh ha dado el correcto y esto debería haber sido marcado como la respuesta ...
Michal B.
-1 - Request.Url a menudo proporciona una URL como "/ carpeta1 / carpeta2" y excluye el dominio por completo.
Justin
4
@Justin: Request.Url te da un objeto Uri que tiene todas las piezas desglosadas para ti. No debería darte una cuerda. Al menos no en la versión de .net que estoy usando
JoshBerke
6
Esta respuesta podría mejorarse agregando el código que lo hace funcionar como la respuesta a continuación que tiene más votos arriba ...
theJerm
171
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

Método Uri :: GetLeftPart :

El método GetLeftPart devuelve una cadena que contiene la parte más a la izquierda de la cadena URI, que termina con la parte especificada por part.

Enumeración UriPartial :

El esquema y los segmentos de autoridad del URI.

Jorge
fuente
5
¡Mucho mejor que analizar la URL!
Evgenyt
1
esta es la mejor respuesta! tnx!
AminM
Esta debería ser la respuesta seleccionada. Demasiada manipulación de cadenas innecesaria.
Ghasan
1
Usando este método, http: // www.lala.xxx/blah/blah devolverá http: // www.lala.xxx
live-love
+1 Y no es lo mismo que .Authority que, en las pruebas que hice en localhost, omite la parte del protocolo (http: //).
GGleGrand
122

Para cualquiera que todavía se lo pregunte, hay una respuesta más completa disponible en http://devio.wordpress.com/2009/10/19/get-absolut-url-of-asp-net-application/ .

public string FullyQualifiedApplicationPath
{
    get
    {
        //Return variable declaration
        var appPath = string.Empty;

        //Getting the current context of HTTP request
        var context = HttpContext.Current;

        //Checking the current context content
        if (context != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}",
                                    context.Request.Url.Scheme,
                                    context.Request.Url.Host,
                                    context.Request.Url.Port == 80
                                        ? string.Empty
                                        : ":" + context.Request.Url.Port,
                                    context.Request.ApplicationPath);
        }

        if (!appPath.EndsWith("/"))
            appPath += "/";

        return appPath;
    }
}
Brian Hasden
fuente
4
Funcionó perfectamente. Si el sitio es el servidor: 8080 / MySiteName , lo obtiene correctamente.
Michael La Voie
2
Gracias por compartir el código real en lugar de un enlace en otro lugar.
theJerm
2
context.Request.Url.Port == 80 causará problemas dentro de HTTPS
Evgenyt
7
¡Atención! No funciona para https. Para https tenga que sustituir context.Request.Url.Port == 80 por (context.Request.Url.Port == 80 && context.Request.Url.Scheme == "http") || (context.Request.Url.Port == 443 && context.Request.Url.Scheme == "https")o por debajo utilización respuesta
Razón
1
Funciona también para localhost (si está probando localmente). Si no necesita el puerto, puede usar "http: //" + HttpContext.Current.Request.Url.Host;
CyberHawk
32

Si la URL de ejemplo es http://www.foobar.com/Page1

HttpContext.Current.Request.Url; //returns "http://www.foobar.com/Page1"


HttpContext.Current.Request.Url.Host; //returns "www.foobar.com"


HttpContext.Current.Request.Url.Scheme; //returns "http/https"


HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); //returns "http://www.foobar.com"
Dheeraj Palagiri
fuente
1
No no. .Hostde "http://www.foobar.com/Page1"es www.foobar.com, no foobar.com.
tchelidze
1
sí, tienes razón, actualizó la respuesta. @tchelidze gracias
Dheeraj Palagiri
27
string hostUrl = Request.Url.Scheme + "://" + Request.Url.Host; //should be "http://hostnamehere.com"
Ben Lesh
fuente
16

Para obtener la cadena de URL de solicitud completa:

HttpContext.Current.Request.Url

Para obtener la parte www.foo.com de la solicitud:

HttpContext.Current.Request.Url.Host

Tenga en cuenta que, hasta cierto punto, está a merced de factores ajenos a su aplicación ASP.NET. Si IIS está configurado para aceptar varios o cualquier encabezado de host para su aplicación, entonces cualquiera de esos dominios que se resolvieron en su aplicación a través de DNS puede aparecer como la URL de solicitud, dependiendo de cuál ingresó el usuario.

Rex M
fuente
1
la solución más simple aquí
full_prog_full
4
Match match = Regex.Match(host, "([^.]+\\.[^.]{1,3}(\\.[^.]{1,3})?)$");
string domain = match.Groups[1].Success ? match.Groups[1].Value : null;

host.com => regresar host.com
s.host.com => regresar host.com

host.co.uk => return host.co.uk
www.host.co.uk => return host.co.uk
s1.www.host.co.uk => return host.co.uk

NQuenault
fuente
Me doy cuenta de que esta es una publicación antigua, pero NQuenault muy bien hecho, no soy bueno en Regex Expressions tan bien hecho. Exactamente lo que necesitaba.
JeffreyJ
@nquenault ¿Alguna idea sobre la mejor manera de manejar un nombre de host como www.abc.com? ¡Gracias!
Gary Ewan Park
4

- Agregar el puerto puede ayudar cuando se ejecuta IIS Express

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port
JonathanC
fuente
3
string domainName = Request.Url.Host
Sk93
fuente
3

Sé que esto es más antiguo, pero la forma correcta de hacerlo ahora es

string Domain = HttpContext.Current.Request.Url.Authority

Eso obtendrá la dirección IP o DNS con puerto para un servidor.

ociosas23
fuente
3

Esto también funciona:

string url = HttpContext.Request.Url.Authority;

Fribu - Soluciones inteligentes
fuente
1

Ejemplo de C # a continuación:

string scheme = "http://";
string rootUrl = default(string);
if (Request.ServerVariables["HTTPS"].ToString().ToLower() == "on")
{
  scheme = "https://";
}
rootUrl = scheme + Request.ServerVariables["SERVER_NAME"].ToString();
Saul Dolgin
fuente
1
string host = Request.Url.Host;
Regex domainReg = new Regex("([^.]+\\.[^.]+)$");
HttpCookie cookie = new HttpCookie(cookieName, "true");
if (domainReg.IsMatch(host))
{
  cookieDomain = domainReg.Match(host).Groups[1].Value;                                
}
Shawn Constance
fuente
1

Esto devolverá específicamente lo que está preguntando.

Dim mySiteUrl = Request.Url.Host.ToString()

Sé que esta es una pregunta anterior. Pero necesitaba la misma respuesta simple y esto devuelve exactamente lo que se pregunta (sin http: //).

tomepenn
fuente