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