ASP.NET中获取当前域的最好方法是什么?
我想知道什么是最好的方式来获取当前的域在ASP.NET中?
例如:
http://www.domainname.com/subdir/应产生http://www.domainname.com http://www.sub.domainname.com/subdir/应产生http://sub.domainname.com
作为一个指导,我应该能够添加一个URL像“/Folder/Content/filename.html”(比如由ASP.NET MVC中的Url.RouteUrl()生成)直接到URL,它应该工作。
与MattMitchell的一样,但有一些修改。 这将检查默认端口。
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)
根据这个链接,一个好的起点是:
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
但是,如果域是http://www.domainname.com:500这将失败。;
像下面这样的东西很想解决这个问题:
int defaultPort = Request.IsSecureConnection ? 443 : 80; Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");
但是,端口80和443将取决于configuration。
因此,您应该使用IsDefaultPort
作为上面从IsDefaultPort
接受的答案 。
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
这个bug迫使我把我的域名主机作为一个string插入到configuration文件中。
为什么不使用
Request.Url.Authority
它返回整个域和端口。
你仍然需要数字http或https
其他方式:
string domain; Uri url = HttpContext.Current.Request.Url; domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
怎么样:
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:
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();
简单和短的方式(它支持架构,域和端口):
var MyUri= Request.UrlReferrer; // Use this like: Var fullDomain = myUri.Scheme + Uri.SchemeDelimiter + myUri.Authority; // Example output: https://www.example.com:5031 // Example output: http://www.example.com:5031 // Example output: https://www.example.com
怎么样:
String domain = "http://" + Request.Url.Host