Como posso obter a base do site?

183

Quero escrever um método auxiliar que retorne a URL base do site. Isto é o que eu vim com:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

Existe algum erro nisso, em que você pode pensar? Alguém pode melhorar isso?

Jaggu
fonte

Respostas:

324

Tente o seguinte:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";
Frank Allenby
fonte
13
Esta é a única resposta que eu encontrei que lida com o caso em que um site é um aplicativo filho de um site de nível superior no IIS.
John
6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb
2
O Request.Url.Scheme nem sempre funciona quando você tem http interno configurado e a terminação SSL configurada para https internamente em um servidor, mas executando https * fora. Para contornar isso, eu simplesmente criei uma AppSetting Key "UrlScheme" específica do ambiente, com o valor "http" ou "https", com base na localização do site. Essa configuração no web.config pode ser acessada por ConfigurationManager.AppSettings ["Key"]
Ben Sewards
3
Isso não leva em consideração o balanceamento de carga, onde ocorre a descriptografia ou os proxies de encaminhamento. Você pode acabar usando um endereço incorreto usando isso. Portanto, tenha cuidado e saiba onde seu site foi implantado.
Conor Gallagher
$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {{System.Web.HttpContext.Cur‌ rent.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penfold
166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

É isso aí ;)

Bruxo
fonte
25
Isso não funciona para o caminho virtual ou de aplicativo. Você deve usar Request.ApplicationPath além da parte esquerda.
Warlock
url base é httpx: //domain.com: [port] / você deve adicionar caminho app-se a esta solução
Pawel Cioch
9

Infelizmente, a GetLeftPartsolução popular não é suportada na versão PCL do Uri. GetComponentsé, no entanto, se você precisar de portabilidade, faça o seguinte:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
Todd Menier
fonte
6

Acredito que as respostas acima não consideram quando o site não está na raiz do site.

Este é um para o controlador WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
rufo
fonte
De dentro de um controlador, use Configuration.VirtualPathRoot, pois é independente do host.
Darrel Miller
5

Para mim, o @ warlock's parece a melhor resposta aqui até agora, mas eu sempre usei isso no passado;

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

Ou em um controlador WebAPI;

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

o que é útil para que você possa escolher qual formato de escape você deseja. Não sei ao certo por que existem duas implementações tão diferentes, e até onde eu sei, esse método e o @ warlock retornam exatamente o mesmo resultado neste caso, mas parece GetLeftPart()que também funcionaria para mailtotags semelhantes a Uri que não sejam do servidor, por exemplo .

cirro
fonte
retorna URL inválido para os casos em que você está atrás do ngrok tunnel e https
Mohammad Zekrallah
5

Este é um método muito mais à prova de idiotas.

VirtualPathUtility.ToAbsolute("~/");
Daniel A. White
fonte
@ Daniel chamada não retornará simplesmente /se hospedar em algum domínio de aplicação por exemplo yourserver / YourApplicationName / yourrootpath
vibs2006
@ vibs2006 sim, seu tipo de pergunta ambígua #
Daniel A. White
4

eu vou com

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Talha
fonte
1
Isso adicionará o protocolo: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee
4

Com base no que Warlock escreveu, descobri que a raiz do caminho virtual é necessária se você não estiver hospedado na raiz da sua web. (Isso funciona para controladores MVC Web API)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
SpazDude
fonte
1

Estou usando o seguinte código de Application_Start

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

Crispijn Lange
fonte
1

Isso funciona para mim.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : retorna o caminho completo, exatamente como mostra o navegador.
  • Request.Url.PathAndQuery : retorna o (caminho completo) - (nome do domínio + PORT).
  • Request.ApplicationPath : retorne "/" no servidor hospedado e "nome do aplicativo" na implantação local do IIS.

Portanto, se você deseja acessar seu nome de domínio, inclua o nome do aplicativo no caso de:

  1. Implantação do IIS
  2. Se seu aplicativo foi implantado no subdomínio.

====================================

Para o dev.x.us/web

retorna este texto forte

FAHID
fonte
0

Por favor, use o código abaixo                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
Pranav Joseph
fonte
Por favor, explique seu código para que outros usuários possam entender sua funcionalidade. Obrigado!
Ignacio Ara
-1
 string baseURL = HttpContext.Request.Url.Host;
shebin c babu
fonte
-2

você poderia adicionar na porta a porta não 80 / SSL?

algo como:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

e usar isso no resultado final?

Mark Redman
fonte
6
Request.Url.Authorityincluirá o número da porta se não for padrão
Andomar 14/11