2014-01-15 76 views
0

我目前有一個RESTful C#web服務來獲取客戶端的IP地址。這工作正常,直到實現負載平衡。所以,現在Web服務正坐在負載平衡器後面。在C#中獲取IP地址

現在,每次我嘗試獲取用戶的IP地址時,我都會獲取負載平衡器的IP地址。這裏是代碼的樣子...

System.Web.HttpContext context = System.Web.HttpContext.Current; 
     if (context.Request.ServerVariables.AllKeys.Contains("HTTP_CLIENT_IP") && CheckIP(context.Request.ServerVariables["HTTP_CLIENT_IP"])) 
      return new Model(context.Request.ServerVariables["HTTP_CLIENT_IP"]); 

     if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_FORWARDED_FOR")) 
      foreach (string ip in context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(',')) 
       if (CheckIP(ip.Trim())) 
        return new Model(ip.Trim()); 

     if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_FORWARDED") && CheckIP(context.Request.ServerVariables["HTTP_X_FORWARDED"])) 
      return new Model(context.Request.ServerVariables["HTTP_X_FORWARDED"]); 

     if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_CLUSTER_CLIENT_IP") && CheckIP(context.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"])) 
      return new Model(context.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"]); 

     if (context.Request.ServerVariables.AllKeys.Contains("HTTP_FORWARDED_FOR") && CheckIP(context.Request.ServerVariables["HTTP_FORWARDED_FOR"])) 
      return new Model(context.Request.ServerVariables["HTTP_FORWARDED_FOR"]); 

     if (context.Request.ServerVariables.AllKeys.Contains("HTTP_FORWARDED") && CheckIP(context.Request.ServerVariables["HTTP_FORWARDED"])) 
      return new Model(context.Request.ServerVariables["HTTP_FORWARDED"]); 

     return new Model(context.Request.ServerVariables["REMOTE_ADDR"]); 

儘管如此,我仍然最終得到錯誤的IP地址。有什麼想法嗎?想法?我錯過了什麼嗎?

+0

你可以在未來的原始請求的痕跡?如果是這樣,是否有任何標題包含原始IP地址?如果沒有,你需要改變你的負載平衡器給你這個數據,否則你運氣不好。如果是這樣,只需要請求該頭並獲取數據。 – Tejs

+0

嘗試HTTP標頭的'X-Forwarded-For'。 – vcsjones

回答

4

性能良好的負載均衡器應在X_FORWARDED_FOR標頭中放置一個或更多 IP地址。您的代碼正在檢查HTTP_FORWARDED_FOR和另外兩個不太正確的變量。

並非所有的負載均衡器都表現良好,有些可以配置爲包含該標頭,如果它當前不在那裏。

如果存在多個轉發點,則標題中會有多個IP地址。在這種情況下,列出的第一個是客戶端IP

X - 轉發適用於:客戶端,PROXY1,Proxy2將

+0

所以我嘗試了這樣的事情... string ip = context.Request.ServerVariables [「X_FORWARDED_FOR」]。Split(',')[0]; ...但這似乎不起作用。這是一個負載均衡問題嗎? – prawn

+0

如果HTTP頭中不存在X_FORWARDED_FOR,那麼負載平衡器沒有正確添加該頭。您應該與負責管理負載均衡器的人講話,並解釋您的代碼需要該標題。 –