2009-03-27 12 views
15

Gibt es eine Möglichkeit, HttpContext.Current.Request.Url.Host und HttpContext.Current.Request.ApplicationPath in einem Aufruf zu erhalten?Request.Url.Host und ApplicationPath in einem Aufruf

Etwas wie "vollständige Anwendungs-URL"?

EDIT: Klarstellung - was ich brauche, ist dies der Teil innerhalb []:

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

frage ich einfach aus Neugier.

EDIT 2: Danke für alle Antworten, aber keiner von ihnen war genau das, was ich suchte. FYI, löste ich das Problem auf diese Weise (aber ich bin immer noch daran interessiert zu wissen, ob es ein glatter Weg ist):

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

Sie wollen Request.Url.Authority, in der Theorie; Host hat keinen Port. Leider ist es am besten, den Inhalt von Request.Headers ["HOST"] zu verwenden, da dieser den DNS-Port des Servers enthalten sollte, mit dem der Client eine Verbindung hergestellt hat. Wenn Sie sich Sorgen um HTTP/1.0-Anfragen machen, können Sie natürlich auf Request.Url.Host zurückgreifen. Ich habe Request.Url.Authority persönlich erfahren, um den Port zurückzugeben, an den die Serversoftware gebunden ist, nicht den Port in der "HOST" -Header --- das ist, was der Client verwendet, um eine Verbindung herzustellen. (FWIW, es war in SSRS 2012 Bericht Manager Website.) – Granger

Antwort

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 erhält möglicherweise nicht den von Ihnen benötigten Hostnamen - z. Host-Header-Auflösung (http://msdn.microsoft.com/en-us/library/ms524602.aspx)! Korrigieren Sie mich, wenn ich falsch liege :) – veggerby

+2

Ich habe dieses seit Jahren, auf verschiedenen Seiten verwendet - und es gibt Ihnen den Server-Namen der Anfrage gemacht, die alle von http: // zum ersten/ – MartinHN

+0

ist Wenn dies funktioniert, vielen Dank. War auf der Suche nach etwas, das mit nicht-Standard-Ports und mit URLs wie https://www.blah.com/web/test/hello.aspx funktionieren würde. Ich werde es drehen. – infocyde

2

prüfen 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; 
} 

Wenn Sie nicht bekommen, was Sie brauchen aus getBaseURL direcly sollte möglich sein, zu tun:

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

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

Danke, aber nein - das gibt Ihnen den vollständigen Pfad der ASPX-Seite, die es heißt. Ich möchte nur Host + Anwendungspfad, nicht Seitenpfad. –

3

Danke für alle Antworten, aber keiner von ihnen war genau das, wonach ich suchte. FYI, löste ich das Problem auf diese Weise (aber ich bin immer noch daran interessiert zu wissen, ob es ein glatter Weg ist):

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

Was ist, wenn es https ist? –

+0

Ja, meine Lösung behandelt das nicht wirklich, aber das würde: return String.Format ("{0}: // {1} /", Request.Url.Scheme, Request.Url.Host); –

5

Was sollten Sie wirklich tun, ist:

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

diese Weise ist es, wenn Sie funktioniert HTTPS verwendet

16

Dies ist nicht mit einer Portnummer so gemacht geringfügige Änderung auf meinen localhost arbeitet (oder ein anderes 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; 
    }