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

我想写一个小帮手方法,它返回该网站的基本url。 这就是我想到的:

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

这有没有什么错误,你可以想一想? 任何人都可以改进呢?

尝试这个:

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

而已 ;)

GetLeftPart是, Uri的PCL版本不支持受欢迎的GetLeftPart解决scheme。 然而, GetComponents是如此,如果你需要可移植性,这应该做的伎俩:

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

对我来说,@术士看起来是迄今为止最好的答案,但我以前一直使用这个。

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

或者在一个WebAPI控制器中;

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

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

我相信上面的答案不考虑网站何时不在网站的根目录。

这是一个WebApi控制器:

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

我跟着去

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

根据Warlock写的内容,我发现如果你不在你网站的根目录下,那么就需要虚拟path根目录。 (这适用于MVC Web API控制器)

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

这对我有用。

 Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath; 
  • Request.Url.OriginalString :返回与浏览器显示相同的完整path。
  • Request.Url.PathAndQuery :返回(完整path) – (域名+ PORT)。
  • Request.ApplicationPath :在宿主服务器上返回“/”,在本地IIS上部署“application name”。

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

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

我使用Application_Start中的以下代码

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

这是一个更傻的certificate方法。

 VirtualPathUtility.ToAbsolute("~/"); 

你可能会添加非端口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()); } 

并在最终结果中使用?