Pergunta

Gostaria de saber qual é a melhor maneira de obter o domínio atual no ASP.NET?

Por exemplo:

http://www.nomedodomínio.com/subdir/ deveria render http://www.nomedodomínio.com http://www.sub.domainname.com/subdir/ deveria render http://sub.nomedodomínio.com

Como guia, devo ser capaz de adicionar um URL como "/Folder/Content/filename.html" (digamos, gerado por Url.RouteUrl() no ASP.NET MVC) diretamente no URL e deve funcionar.

Foi útil?

Solução

Mesma resposta de MattMitchell, mas com algumas modificações.Em vez disso, isso verifica a porta padrão.

Editar:Sintaxe atualizada e usando Request.Url.Authority como sugerido

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

Outras dicas

Conforme esse link um bom ponto de partida é:

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

No entanto, se o domínio for http://www.nomedodomínio.com:500 isso irá falhar.

Algo como o seguinte é tentador para resolver isso:

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

No entanto, as portas 80 e 443 dependerão da configuração.

Como tal, você deve usar IsDefaultPort como no Resposta aceita acima de Carlos Muñoz.

Request.Url.GetLeftPart(UriPartial.Authority)

Este é um esquema incluído.

AVISO! Para quem usa Solicitação atual.Url.Host.Entenda que você está trabalhando com base na PEDIDO ATUAL e que a solicitação atual nem SEMPRE estará com o seu servidor e às vezes pode estar com outros servidores.

Portanto, se você usar isso em algo como Application_BeginRequest() em Global.asax, em 99,9% das vezes tudo ficará bem, mas em 0,1% você poderá obter algo diferente do nome de host do seu próprio servidor.

Um bom exemplo disso é algo que descobri há pouco tempo.Meu servidor tende a bater http://proxyjudge1.proxyfire.net/fastenv de tempos em tempos.Application_BeginRequest() lida com essa solicitação com prazer, portanto, se você chamar Request.Url.Host ao fazer essa solicitação, você receberá de volta proxyjudge1.proxyfire.net.Alguns de vocês podem estar pensando "não, duh", mas vale a pena notar porque foi um bug muito difícil de notar, já que acontecia apenas 0,1% das vezes:P

Este bug me forçou a inserir meu host de domínio como uma string nos arquivos de configuração.

Por que não usar

Request.Url.Authority

Ele retorna todo o domínio E a porta.

Você ainda precisa descobrir http ou https

Simples e curto maneira (suporta esquema, domínio e porta):

Usar 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

Outra maneira:


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

Que 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"];

Usando o 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();

Que tal:

String domain = "http://" + Request.Url.Host
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top