2008-09-15 117 views
92

我想知道什么是获得当前域的最佳方式是在ASP.NET中?ASP.NET中获取当前域的最佳方法是什么?

例如:

http://www.domainname.com/subdir/应该产生http://www.domainname.com http://www.sub.domainname.com/subdir/应该得到http://sub.domainname.com

作为指导,我应该能够添加一个网址,如 “/Folder/Content/filename.html”(发言权由ASP.NET MVC中的Url.RouteUrl()生成)直接到URL,它应该工作。

+3

注意 “当前域” 在这里实际上什么是这些用户代理用于访问您的网站,在许多情况下,这与您网站的“官方网址”以及最终用户可能进入浏览器的内容不同(反向代理,转发代理,内部主机名,IP 地址, ...)。 – bzlm 2009-04-29 16:06:03

+1

那么有没有办法得到“官方网址”(来自IIS的一个)? – 2009-05-01 03:02:59

回答

166

相同的答案MattMitchell的,但有一些修改。 这会检查默认端口。

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + 
(Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port) 
34

按照this link一个很好的出发点是:

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端口将取决于配置。

因此,您应该使用IsDefaultPort作为上述来自CarlosMuñoz的Accepted Answer

+1

为什么假设端口80在这里?如果你删除了这个假设,那么代码看起来就像是一窍不通。当您假定端口80时,您将在许多情况下失败(请参阅其他端口上的注释)。如果您希望尽可能删除端口号,则必须检查端口号是相关方案的默认端口号,并且该方案支持默认端口号。 – bzlm 2009-04-29 16:03:55

+0

是的,看到端口80可能是一个坏主意的说明。我不知道任何其他方式,但这就是为什么我提到它需要依赖配置。 – 2009-05-01 03:08:45

+1

我不知道这是否有用,但你也可以尝试:如果Request.IsSecureConnection确定是否使用HTTPS? – 2013-06-12 19:44:05

-1

如何:

String domain = "http://" + Request.Url.Host 
+0

不错,但如果您的网站有安全网页,例如https:// 如果您的网域未托管在端口80上,该怎么办? – 2008-09-15 03:16:30

0

如何:

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"]; 
0

另一种方式:


string domain; 
Uri url = HttpContext.Current.Request.Url; 
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty); 
18

警告!给任何人使用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

这个错误迫使我插入我的域名主机作为一个字符串在配置文件中。

12

为什么不使用

Request.Url.Authority

它返回整个域和端口。

你仍然需要弄清楚HTTP或

23
Request.Url.GetLeftPart(UriPartial.Authority) 

这包括方案HTTPS。

0

使用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(); 
0

简单方式(它支持架构,域和端口):

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 
相关问题