Come posso ottenere il Baseurl del sito?

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, a cui puoi pensare? Qualcuno può migliorare su questo?

Prova questo:

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

Questo è tutto 😉

GetLeftPart popolare soluzione GetLeftPart non è supportata nella versione PCL di Uri . GetComponents è, tuttavia, così se hai bisogno di portabilità, questo dovrebbe fare il trucco:

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

Per me, @ warlock sembra la migliore risposta fino ad ora, ma l’ho sempre usato 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 il formato di escape che si desidera. Non sono chiaro perché ci siano due implementazioni così diverse, e per quanto posso dire, questo metodo e @ warlock restituiscono esattamente lo stesso risultato in questo caso, ma sembra che GetLeftPart() funzioni anche per gli Uri non server come tag mailto per esempio.

Credo che le risposte di cui sopra non considerano 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('/') ; 

vado con

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

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

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

Questo è un metodo molto più infallibile.

 VirtualPathUtility.ToAbsolute("~/"); 

Questo funziona per me.

 Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath; 
  • Request.Url.OriginalString : restituisce il percorso completo come mostrato dal browser.
  • Request.Url.PathAndQuery : restituisce il (percorso completo) – (nome di dominio + PORTA).
  • Request.ApplicationPath : restituisce “/” sul server host 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. Implementazione di IIS
  2. Se la tua applicazione è stata distribuita nel sottodominio.

Sto usando il seguente codice da Application_Start

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

Si prega di utilizzare il codice seguente

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

è ansible aggiungere la porta per la porta non 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?