Domanda

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

Qualcosa come "URL completo applicazione"?

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. Cordiali saluti, 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;
}
È stato utile?

Soluzione

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

Altri suggerimenti

Questo non funzionava sul mio localhost con un numero di porta in modo reso piccola modifica:

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

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 (o qualche altro schema!)

Grazie per tutte le risposte, ma nessuno di loro era esattamente quello che stavo cercando. Cordiali saluti, 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;
}

questo 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, "/")

HttpContext.Current.Request.Url.AbsoluteUri
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top