2008-09-15 81 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 
相關問題