Qual é o melhor método no ASP.NET para obter o domínio atual?
-
09-06-2019 - |
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.
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