Request.Url.Host и ApplicationPath в один вызов - PullRequest
16 голосов
/ 27 марта 2009

Есть ли способ получить HttpContext.Current.Request.Url.Host и HttpContext.Current.Request.ApplicationPath за один звонок?

Что-то вроде "полного URL приложения"?

РЕДАКТИРОВАТЬ: Уточнение - мне нужна эта часть в []:

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

Прошу просто из любопытства.

РЕДАКТИРОВАТЬ 2: Спасибо за все ответы, но ни один из них не был именно тем, что я искал. К вашему сведению, я решил проблему таким образом (но все еще хотел бы знать, есть ли более плавный путь):

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

Ответы [ 6 ]

30 голосов
/ 27 марта 2009
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;
}
18 голосов
/ 28 сентября 2009

Это не работает на моем локальном хосте с номером порта, поэтому внесены незначительные изменения:

  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;
    }
5 голосов
/ 19 августа 2009

Что вы действительно должны сделать, это:

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

Таким образом, он работает, если вы используете HTTPS (или другую схему!)

3 голосов
/ 30 марта 2009

Спасибо за все ответы, но ни один из них не был именно тем, что я искал. К вашему сведению, я решил проблему таким образом (но все еще хотел бы знать, есть ли более плавный путь):

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;
}
2 голосов
/ 27 марта 2009

Проверить этот пост :

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

Если вы не получите то, что вам нужно от GetBaseUrl, это должно быть возможно сделать:

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

1 голос
/ 27 марта 2009
HttpContext.Current.Request.Url.AbsoluteUri
...