我想写一个小帮助方法,它返回网站的基本网址。这就是我想出的:
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;
}
这有什么错误,你能想到吗?任何人都可以改进吗?
答案 0 :(得分:305)
试试这个:
string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +
Request.ApplicationPath.TrimEnd('/') + "/";
答案 1 :(得分:162)
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)
就是这样;)
答案 2 :(得分:8)
不幸的是,GetLeftPart
的PCL版本不支持流行的Uri
解决方案。但是,GetComponents
是如此,如果您需要可移植性,这应该可以解决问题:
uri.GetComponents(
UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
答案 3 :(得分:6)
对我来说,@ warlock在目前为止看起来是最好的答案,但我过去总是使用它;
string baseUrl = Request.Url.GetComponents(
UriComponents.SchemeAndServer, UriFormat.UriEscaped)
或者在WebAPI控制器中;
string baseUrl = Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped)
这很方便,因此您可以选择所需的转义格式。我不清楚为什么有两个这样的不同实现,据我所知,这个方法和@ warlock在这种情况下返回完全相同的结果,但看起来GetLeftPart()
也适用于非服务器例如,Uri就像mailto
标签一样。
答案 4 :(得分:6)
我认为上述答案并未考虑该网站何时不在网站的根目录中。
这是一个WebApi控制器:
string baseUrl = (Url.Request.RequestUri.GetComponents(
UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/')
+ HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
答案 5 :(得分:5)
我选择
HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
答案 6 :(得分:4)
这是一种更加万无一失的方法。
VirtualPathUtility.ToAbsolute("~/");
答案 7 :(得分:4)
根据Warlock编写的内容,我发现如果您没有托管在网络的根目录,则需要虚拟路径根目录。 (这适用于MVC Web API控制器)
String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority)
+ Configuration.VirtualPathRoot;
答案 8 :(得分:1)
这适合我。
Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
因此,如果您想访问您的域名,请考虑在以下情况下包含应用程序名称:
答案 9 :(得分:1)
我正在使用Application_Start中的以下代码
String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);
答案 10 :(得分:0)
请使用以下代码
string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
答案 11 :(得分:0)
string baseURL = HttpContext.Request.Url.Host;
答案 12 :(得分:-2)
您可以在端口中添加非端口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());
}
并在最终结果中使用它?