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