在一次调用中Request.Url.Host和ApplicationPath

时间:2009-03-27 13:01:05

标签: c# asp.net code-behind httpcontext

有没有办法在一次通话中获得HttpContext.Current.Request.Url.HostHttpContext.Current.Request.ApplicationPath

像“完整申请网址”这样的内容?

编辑:澄清 - 我需要的是[]中的部分:

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 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:18)

这不能在我的localhost上使用端口号进行小修改:

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

答案 2 :(得分:5)

你应该做的是:

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

如果您使用的是HTTPS(或其他模式!),那么它就可以了。

答案 3 :(得分:3)

感谢所有的回复,但这些回复都不是我想要的。 仅供参考,我以这种方式解决了问题(但我仍然有兴趣了解是否有更顺畅的方式):

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

答案 4 :(得分:2)

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

如果你没有从GetBaseUrl那里得到你需要的东西,应该可以做到:

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

答案 5 :(得分:1)

HttpContext.Current.Request.Url.AbsoluteUri