Request.Url.Host 和 ApplicationPath 一次调用

Posted

技术标签:

【中文标题】Request.Url.Host 和 ApplicationPath 一次调用【英文标题】:Request.Url.Host and ApplicationPath in one call 【发布时间】:2010-10-15 22:29:26 【问题描述】:

有什么方法可以在一个电话中获得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;

【问题讨论】:

理论上你想要Request.Url.Authority;主机没有端口。不幸的是,最好的办法是使用 Request.Headers["HOST"] 中的内容,因为它应该包含客户端用来连接的服务器的 dns:port。如果您担心 HTTP/1.0 请求,当然可以回退到 Request.Url.Host。我亲身体验过 Request.Url.Authority 返回服务器软件绑定的端口,而不是“HOST”标头中的端口——这是客户端用来连接的。 (FWIW,它位于 s-s-rS 2012 的报告管理器网站中。) 【参考方案1】:
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;

【讨论】:

IIRC SERVER_NAME 可能无法为您提供所需的主机名 - 例如主机头解析(msdn.microsoft.com/en-us/library/ms524602.aspx)!如果我错了,请纠正我:) 我已经在不同的网站上使用了这个多年 - 它为您提供了请求的服务器名称,从 http:// 到第一个 / 如果可行,非常感谢。正在寻找可以与非标准端口和blah.com/web/test/hello.aspx 等网址一起使用的东西。我会试一试。 我从自己的帖子中删除了答案标签,并将其移至此,因为此答案涵盖了更多情况。【参考方案2】:

这在我的带有端口号的本地主机上不起作用,因此进行了小修改:

  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;
    

【讨论】:

【参考方案3】:

你真正应该做的是:

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

如果您使用的是 HTTPS(或其他一些架构!),那么它可以工作。

【讨论】:

【参考方案4】:

感谢所有回复,但没有一个是我想要的。 仅供参考,我以这种方式解决了问题(但我仍然想知道是否有更顺畅的方式):

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;

【讨论】:

是的,我的解决方案并没有真正处理这个问题,但这会:返回 String.Format("0://1/", Request.Url.Scheme, Request.Url .Host);【参考方案5】:

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

【讨论】:

【参考方案6】:
HttpContext.Current.Request.Url.AbsoluteUri

【讨论】:

谢谢,但没有 - 这为您提供了调用它的 ASPX 页面的完整路径。我只想要主机 + 应用程序路径,而不是页面路径。

以上是关于Request.Url.Host 和 ApplicationPath 一次调用的主要内容,如果未能解决你的问题,请参考以下文章

.Request.Url.Host不显示子域名

微信小程序request请求封装

Request.UrlReferrer没有给出预期的结果

域名-从url获取

ASP.NET(C#)怎么获得当前域名?

使用 .NET 和 IIS 的多租户 SaaS