it-swarm.it

Come posso ottenere la base 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?

169
Jaggu

Prova questo:

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

Questo è tutto ;)

163
Warlock

La popolare soluzione GetLeftPart 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);
8
Todd Menier

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('/') ;
6
rufo

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 il motivo per cui ci sono 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() possa funzionare anche per i tag Uri mailto non server per esempio.

6
cirrus

Vado con

HttpContext.Current.Request.ServerVariables["HTTP_Host"]
5
Talha

Questo è un metodo molto più infallibile.

VirtualPathUtility.ToAbsolute("~/");
4
Daniel A. White

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;
4
SpazDude

Sto usando il seguente codice da Application_Start

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

1
Crispijn Lange

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 locale IIS.

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

  1. Distribuzione di IIS
  2. Se la tua applicazione è stata distribuita nel sottodominio.
1
FAHID
 string baseURL = HttpContext.Request.Url.Host;
0
shebin c babu

Si prega di utilizzare il codice sottostante

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