2009-03-27 9 views
15

C'è un modo per ottenere HttpContext.Current.Request.Url.Host e HttpContext.Current.Request.ApplicationPath in una chiamata?Request.Url.Host e ApplicationPath in una chiamata

Qualcosa come "URL applicazione completa"?

EDIT: Precisazione - che cosa ho bisogno è questa la parte entro []:

http://[www.mysite.com/mywebapp]/Pages/Default.aspx 

chiedo semplicemente per curiosità.

EDIT 2: Grazie per tutte le risposte, ma nessuno di loro era esattamente quello che stavo cercando. FYI, ho risolto il problema in questo modo (ma sono ancora interessato a sapere se c'è un modo più agevole):

public string GetWebAppRoot() 
{ 
    if(HttpContext.Current.Request.ApplicationPath == "/") 
     return "http://" + HttpContext.Current.Request.Url.Host; 
    else 
     return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath; 
} 
+0

Si desidera Request.Url.Authority, in teoria; L'host non ha la porta. Sfortunatamente, la cosa migliore da fare è usare ciò che è in Request.Headers ["HOST"], poiché si suppone che contenga il dns: port del server utilizzato dal client per connettersi. Se sei preoccupato per le richieste HTTP/1.0, puoi ricorrere a Request.Url.Host, ovviamente. Personalmente ho sperimentato Request.Url.Authority per restituire la porta a cui è associato il software del server, non la porta nell'intestazione "HOST" --- che è ciò che il client usava per connettersi. (FWIW, era nel sito Web di Report Manager di SSRS 2012). – Granger

risposta

29
public static string GetSiteRoot() 
{ 
    string port = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"]; 
    if (port == null || port == "80" || port == "443") 
    port = ""; 
    else 
    port = ":" + port; 

    string protocol = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT_SECURE"]; 
    if (protocol == null || protocol == "0") 
    protocol = "http://"; 
    else 
    protocol = "https://"; 

    string sOut = protocol + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + port + System.Web.HttpContext.Current.Request.ApplicationPath; 

    if (sOut.EndsWith("/")) 
    { 
    sOut = sOut.Substring(0, sOut.Length - 1); 
    } 

    return sOut; 
} 
+0

IIRC SERVER_NAME potrebbe non ottenere il nome host necessario, ad es. risoluzione dell'intestazione host (http://msdn.microsoft.com/en-us/library/ms524602.aspx)! Correggimi se ho sbagliato :) – veggerby

+2

Ho usato questo per anni, su siti diversi - e ti dà il nome del server della richiesta fatta, che è tutto da http: // al primo/ – MartinHN

+0

Se questo funziona, grazie mille. Stavo cercando qualcosa che avrebbe funzionato con porte non standard e con URL come https://www.blah.com/web/test/hello.aspx. Gli darò un giro. – infocyde

2

Controllare this post:

public static Uri GetBaseUrl(HttpRequest request) 
{ 
    Uri contextUri = new Uri(request.Url, request.RawUrl); 
    UriBuilder realmUri = new UriBuilder(contextUri) { Path = request.ApplicationPath, Query = null, Fragment = null }; 
    return realmUri.Uri; 
} 

public static string GetAbsoluteUrl(HttpRequest request, string relativeUrl) 
{ 
    return new Uri(GetBaseUrl(request), VirtualPathUtility.ToAbsolute(relativeUrl)).AbsoluteUri; 
} 

Se non si ottiene quello che ti serve da getBaseURL direcly, è dovrebbe essere possibile fare:

GetAbsoluteUrl(HttpContext.Current.Request, "/")

1
HttpContext.Current.Request.Url.AbsoluteUri 
+0

Grazie, ma no - questo ti dà il percorso completo della pagina ASPX da cui è chiamato. Desidero solo il percorso dell'applicazione host +, non il percorso della pagina. –

3

Grazie per tutte le risposte, ma nessuno di loro era esattamente quello che stavo cercando. FYI, ho risolto il problema in questo modo (ma sono ancora interessato a sapere se c'è un modo più agevole):

public string GetWebAppRoot() 
{ 
    if(HttpContext.Current.Request.ApplicationPath == "/") 
     return "http://" + HttpContext.Current.Request.Url.Host; 
    else 
     return "http://" + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.ApplicationPath; 
} 
+0

cosa succede se è https? –

+0

Sì, la mia soluzione in realtà non lo gestisce, ma questo: return String.Format ("{0}: // {1} /", Request.Url.Scheme, Request.Url.Host); –

5

Che cosa si dovrebbe davvero fare è:

return String.Format("{0}://{1}/", Request.Url.Scheme, Request.Url.Host); 

In questo modo funziona se si utilizza HTTPS

16

Questo non funzionava sul mio localhost con un numero di porta in modo reso piccola modifica (o qualche altro schema!):

private string GetWebAppRoot() 
    { 
     string host = (HttpContext.Current.Request.Url.IsDefaultPort) ? 
      HttpContext.Current.Request.Url.Host : 
      HttpContext.Current.Request.Url.Authority; 
     host = String.Format("{0}://{1}", HttpContext.Current.Request.Url.Scheme, host);    
     if (HttpContext.Current.Request.ApplicationPath == "/") 
      return host; 
     else 
      return host + HttpContext.Current.Request.ApplicationPath; 
    } 
Problemi correlati