it-swarm-pt.tech

Qual é o melhor método no ASP.NET para obter o domínio atual?

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

Por exemplo:

http://www.domainname.com/subdir/ deve render http://www.domainname.comhttp: //www.sub.domainname .com/subdir / deve render http://sub.domainname.com

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

98
Matt Mitchell

Mesma resposta que a de MattMitchell, mas com algumas modificações. 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}"
180
Carlos Muñoz

Conforme este link , um bom ponto de partida é:

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

No entanto, se o domínio for http://www.domainname.com:5 isso 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.

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

Este é o esquema incluído.

28
izlence

AVISO! Para quem usa Current.Request . Url.Host. Entenda que você está trabalhando com base no PEDIDO ATUAL e que a solicitação atual SEMPRE não estará com o servidor e, às vezes, com outros servidores.

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

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

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

19
Thirlan

Por que não usar

Request.Url.Authority

Retorna o domínio inteiro E a porta.

Você ainda precisa descobrir http ou https

13
Korayem

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

se 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

E se:

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

Outra maneira:


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

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();
0
Darren