Come posso ottenere la base del sito?


183

Voglio scrivere un piccolo metodo di supporto che restituisce l'URL di base del sito. Questo è quello che mi è venuto in mente:

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;
}

C'è qualche errore in questo che ti viene in mente? Qualcuno può migliorare su questo?



Risposte:


324

Prova questo:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";

13
Questa è l'unica risposta che ho trovato che si occupa del caso in cui un sito è un'applicazione che è figlio di un sito Web di primo livello in IIS.
Giovanni

6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb

2
Request.Url.Scheme non funziona sempre quando hai configurato http interno e la terminazione SSL impostata per https internamente su un server, ma esegui https * all'esterno. Per ovviare a questo, ho semplicemente creato una chiave di impostazione app specifica per l'ambiente "UrlScheme" con valore di "http" o "https" in base a dove risiede il sito Web. Questa impostazione nel web.config è accessibile da ConfigurationManager.AppSettings ["Chiave"]
Ben Sewards,

3
Ciò non tiene conto del bilanciamento del carico, in cui si verifica la decrittazione o dei proxy di inoltro. Puoi finire con un indirizzo errato usando questo, quindi fai attenzione e sai dove è stato distribuito il tuo sito web.
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)

Questo è tutto ;)


25
Questo non funziona per Virtual o Application Path. È necessario utilizzare Request.ApplicationPath in aggiunta alla parte sinistra.
Stregone

l'URL di base è httpx: //domain.com: [port] / devi aggiungere tu stesso il percorso dell'app a questa soluzione
Pawel Cioch

9

La GetLeftPartsoluzione popolare non è supportata nella versione PCL di Uri, sfortunatamente. GetComponentsè, tuttavia, quindi se hai bisogno di portabilità, questo dovrebbe fare il trucco:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

6

Credo che le risposte di cui sopra non considerino quando il sito non è nella radice del sito Web.

Questo è un controller WebApi:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

Dall'interno di un controller utilizzare Configuration.VirtualPathRoot in quanto indipendente dall'host.
Darrel Miller,

5

Per me, @ warlock's sembra la migliore risposta qui finora, ma l'ho sempre usata in passato;

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

O in un controller WebAPI;

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

che è utile in modo da poter scegliere quale formato di escape si desidera. Non sono chiaro il motivo per cui ci sono due implementazioni così diverse e, per quanto posso dire, questo metodo e @ warlock restituiscono lo stesso risultato esatto in questo caso, ma sembra GetLeftPart()che funzionerebbe anche per i mailtotag simili di Uri non server, ad esempio .


restituisce un URL non valido per i casi in cui sei dietro ngrok tunnel e https
Mohammad Zekrallah,


4

vado con

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

1
Ciò aggiungerà il protocollo: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "Http: //": "https: //") + HttpContext.Request.ServerVariables ["HTTP_HOST"]
onemorecupofcoffee

4

Sulla base di ciò che Warlock ha scritto, ho scoperto che il root del percorso virtuale è necessario se non sei ospitato nella root del tuo web. (Funziona con i controller API Web MVC)

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

1

Sto usando il seguente codice da Application_Start

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


1

Questo funziona per me.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : restituisce il percorso completo come mostrato nel browser.
  • Request.Url.PathAndQuery : restituisce il (percorso completo) - (nome dominio + PORT).
  • Request.ApplicationPath : restituisce "/" sul server ospitato e "nome applicazione" sulla distribuzione IIS locale.

Quindi, se vuoi accedere al tuo nome di dominio, considera di includere il nome dell'applicazione in caso di:

  1. Distribuzione IIS
  2. Se l'applicazione è stata distribuita nel sottodominio.

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

Per dev.x.us/web

restituisce questo testo forte


0

Si prega di utilizzare il seguente codice                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);

Spiega il tuo codice in modo che altri utenti possano comprenderne la funzionalità. Grazie!
Ignacio Ara,


-2

potresti eventualmente aggiungere la porta per non porta 80 / SSL?

qualcosa di simile a:

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 usarlo nel risultato finale?


6
Request.Url.Authorityincluderà il numero di porta se non è standard
Andomar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.