我怎样才能得到网站的BaseUrl?

我想写一个小助手方法,返回网站的基本网址。这是我想出来的:

public static string GetSiteUrl()
{
string url = string.Empty;
HttpRequest request = HttpContext.Current.Request;


if (request.IsSecureConnection)
url = "https://";
else
url = "http://";


url += request["HTTP_HOST"] + "/";


return url;
}

你能想到这里面有什么错误吗?有人能改进这个吗?

288427 次浏览

试试这个:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +
Request.ApplicationPath.TrimEnd('/') + "/";

您是否可以为非端口80/SSL添加端口?

类似于:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
{
port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
}

并在最终结果中使用它?

string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

就是这样;)

对我来说,到目前为止,@术士似乎是最好的答案,但我过去一直使用这个。

string baseUrl = Request.Url.GetComponents(
UriComponents.SchemeAndServer, UriFormat.UriEscaped)

或者在WebAPI控制器中;

string baseUrl = Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped)

这很方便,所以你可以选择你想要的转义格式。我不清楚为什么有两种不同的实现,据我所知,在这种情况下,这个方法和@Warlock的方法返回完全相同的结果,但看起来GetLeftPart()也适用于非服务器URI,例如mailto标签。

我相信上面的答案没有考虑到网站不在网站的根目录中。

这是一个For WebAPI控制器:

string baseUrl = (Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/')
+ HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;

这是一个更愚蠢的证明方法。

VirtualPathUtility.ToAbsolute("~/");

根据Warlock所写的内容,我发现如果您没有托管在Web的根目录中,则需要虚拟路径根目录。(这适用于MVC Web API控制器)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority)
+ Configuration.VirtualPathRoot;

这对我有用。

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • request.URL.originalString:返回与浏览器显示相同的完整路径。
  • request.URL.PathAndQuery:返回(完整路径)-(域名+端口)。
  • 请求.应用程序路径:在托管服务器上返回“/”,在本地IIS部署上返回“应用程序名称”。

因此,如果您想访问您的域名,请考虑在以下情况下包含应用程序名称:

  1. IIS部署
  2. 如果您的应用程序部署在子域上。

===============

对于dev.X.us/web

它返回这个 强文本

遗憾的是,Uri的PCL版本不支持流行的GetLeftPart解决方案。但是,GetComponents支持,因此,如果您需要可移植性,这应该可以解决问题:

uri.GetComponents(
UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);

我一起去

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

我正在使用应用程序_启动中的以下代码

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

请使用以下代码

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);