我想知道获取当前域的最佳方法是在ASP.NET中吗?
例如:
http://www.domainname.com/subdir/应该产生http://www.domainname.com
http://www.sub.domainname.com/subdir/应该产生http://sub.domainname.com
作为指导,我应该能够直接在URL上添加一个URL,例如" /Folder/Content/filename.html"(例如,由ASP.NET MVC中的Url.RouteUrl()生成)。
答案与MattMitchell相同,但有所修改。
而是检查默认端口。
Edit: Updated syntax and using Request.Url.Authority as suggested
1
| $"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}" |
根据此链接,一个好的起点是:
1
| Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host |
但是,如果域为http://www.domainname.com:500,则此操作将失败。
诸如此类的东西很想解决此问题:
1 2 3
| int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
+ (Request.Url.Port != defaultPort ?":" + Request.Url.Port :""); |
但是,端口80和443将取决于配置。
因此,您应该像上面Carlos Mu?oz的"已接受答案"中那样使用IsDefaultPort。
1
| Request.Url.GetLeftPart(UriPartial.Authority) |
这是包含的方案。
警告!对于使用Current.Request.Url.Host的任何人。了解您是基于当前请求进行工作的,并且当前请求永远不会与您的服务器一起使用,有时可能与其他服务器一起使用。
因此,如果在Global.asax中的Application_BeginRequest()之类的方式中使用它,则99.9%的时间是可以的,但0.1%的时间可能会得到您自己服务器的主机名以外的东西。
我不久前发现的东西就是一个很好的例子。我的服务器有时会不定期访问http://proxyjudge1.proxyfire.net/fastenv。 Application_BeginRequest()很乐意处理此请求,因此,如果在发出此请求时调用Request.Url.Host,则会取回proxyjudge1.proxyfire.net。你们中有些人可能会想"不做",但值得注意的是,由于它仅在0.1%的时间内发生,所以这是一个很难发现的错误:P
此错误迫使我将域主机作为字符串插入配置文件中。
为什么不使用
Request.Url.Authority
它返回整个域和端口。
您仍然需要输入http或https
简单快捷(支持架构,域和端口):
使用Request.GetFullDomain()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // Add this class to your project
public static class HttpRequestExtensions{
public static string GetFullDomain(this HttpRequestBase request)
{
var uri= request?.UrlReferrer;
if (uri== null)
return string.Empty;
return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
}
}
// Now Use it like this:
Request.GetFullDomain();
// Example output: https://www.example.com:5031
// Example output: http://www.example.com:5031
// Example output: https://www.example.com |
其他方式:
1 2 3
| string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty); |
怎么样:
1 2 3 4
| NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] =="1" ?"https://" :"http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"]; |
使用UriBuilder:
1 2 3 4 5 6 7 8 9 10 11 12
| var relativePath =""; // or whatever-path-you-want
var uriBuilder = new UriBuilder
{
Host = Request.Url.Host,
Path = relativePath,
Scheme = Request.Url.Scheme
};
if (!Request.Url.IsDefaultPort)
uriBuilder.Port = Request.Url.Port;
var fullPathToUse = uriBuilder.ToString(); |
怎么样:
1
| String domain ="http://" + Request.Url.Host |