web-development-kb-es.site

¿Cuál es el mejor método en ASP.NET para obtener el dominio actual?

Me pregunto cuál es la mejor manera de obtener el dominio actual en ASP.NET.

Por ejemplo:

http://www.domainname.com/subdir/ should yield http://www.domainname.comhttp://www.sub.domainname.com/subdir/ should rendimiento http://sub.domainname.com

Como guía, debería poder agregar una URL como "/Folder/Content/filename.html" (por ejemplo, como se genera en Url.RouteUrl () en ASP.NET MVC) directamente en la URL y debería funcionar.

98
Matt Mitchell

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

Edición: se actualizó la sintaxis y se usó Request.Url.Authority como se sugiere

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
179
Carlos Muñoz

Según este enlace 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 esto fallará.

Algo como lo siguiente es tentador 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, los puertos 80 y 443 dependerán de la configuración.

Como tal, debe usar IsDefaultPort como en la Respuesta Aceptada anterior de Carlos Muñoz.

37
Matt Mitchell
Request.Url.GetLeftPart(UriPartial.Authority)

Este esquema está incluido.

28
izlence

ADVERTENCIA! A cualquiera que use Current.Request . Url.Host. Comprenda que está trabajando en base a la SOLICITUD ACTUAL y que la solicitud actual NO SIEMPRE estará con su servidor y, a veces, puede estar con otros servidores.

Entonces, si usa esto en algo como, Application_BeginRequest () en Global.asax, entonces el 99.9% del tiempo estará bien, pero el 0.1% podría obtener algo distinto al nombre de host de su propio servidor.

Un buen ejemplo de esto es algo que descubrí no hace mucho. 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 realice esta solicitud, recibirá un proxyjudge1.proxyfire.net. Algunos de ustedes podrían estar pensando "no duh", pero vale la pena anotar porque fue un error muy difícil de notar ya que solo sucedió el 0.1% del tiempo: P

Este error me obligó a insertar mi dominio Host como una cadena en los archivos de configuración.

19
Thirlan

¿Por qué no usar

Request.Url.Authority

Devuelve todo el dominio y el puerto.

Aún necesitas calcular http o https

13
Korayem

Simple y short way (admite esquema, dominio y puerto):

Usa Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com
2
RAM

Qué tal si:

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"];
1
Derek Lawless

De otra manera:


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

Utilizando 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
Darren