2012-12-21 46 views
36

這裏我可以使用這兩種方法中的任何一種。有什麼區別,我應該使用哪一個?Request.UserHostAddress和Request.ServerVariables [「REMOTE_ADDR」]。有什麼區別?ToString()

方法1:

string srUserIp = ""; 
    try 
    { 
     srUserIp = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString(); 
    } 
    catch 
    { 

    } 

方法2:

string srUserIp = ""; 
    try 
    { 
     srUserIp = Request.UserHostAddress.ToString(); 
    } 
    catch 
    { 

    } 
+0

如果用戶有一個代理服務器,這些不會產生相同的結果嗎?方法2將取代代理的地址而不是用戶的機器。我不會使用方法2而不是方法1. – lawphotog

+0

只需要讓知道誰在讀這個,這是造成問題的方法。所以我不再使用了。 – MonsterMMORPG

+0

@MonsterMMORPG,引發問題的方法有哪些,有哪些問題? –

回答

52

簡短回答:兩者是相同的。

長答案:爲了確定兩個使用反射器(或任何反彙編你喜歡)之間的差異。

HttpRequest.UserHostAddress屬性的代碼如下:

public string UserHostAddress 
{ 
    get 
    { 
     if (this._wr != null) 
     { 
      return this._wr.GetRemoteAddress(); 
     } 
     return null; 
    } 
} 

注意,它返回_wr.GetRemoteAddress()_wr變量是HttpWorkerRequest對象的一個​​實例。從HttpWorkerRequest派生出的不同類以及使用哪一個取決於您使用的是IIS 6,IIS 7還是其他因素,但是您在Web應用程序中使用的所有類都具有相同的代碼GetRemoteAddress() ,即:

public override string GetRemoteAddress() 
{ 
    return this.GetServerVariable("REMOTE_ADDR"); 
} 

正如你所看到的,GetRemoteAddress()簡單地返回服務器變量REMOTE_ADDR

至於哪一個使用,我建議UserHostAddress財產,因爲是不依賴「魔術弦」。

快樂編程

5

沒有區別。他們返回完全相同的價值。然而,一個是智能感知友好的,而另一個不是。