2015-07-21 44 views
3

我需要在用戶在ASP.NET MVC上運行的其餘API中發出請求時沒有端口的IP。它似乎對地址的方式是它們的組合:從C#中的IPv6安全的IP字符串中刪除端口

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 
HttpContext.Current.Request.UserHostAddress; 

這給我的IP字符串:端口

IPV4很簡單,但是從閱讀中,我希望IPV6會給我這樣的事情:

[1fff:0:a88:85a3::ac1f]:8001 

IPAddress.Parse可以處理帶端口但不帶IPv4端口的IPv6,這很奇怪。

我可以檢查字符串,看看它是什麼樣的地址,但我覺得應該有更好的方法。

任何想法?

+0

我不會以紀念這是重複我的臨時版本,但這個答案你可能會感興趣 - http://stackoverflow.com/a/12044845/3032289使用'Uri'也可能是一種選擇,雖然它不完全乾淨。 – Luaan

+0

與我目前的版本類似的方法,真的希望有一個框架方式來做到這一點,如IPEndpoint.Parse。但看起來這將不得不做。 –

+0

那麼,公平地說,包括在一個IP地址中的端口不是完全標準化的數據。這些應該是兩個獨立的字段,因爲IP終端沒有標準,與IP地址和端口不同。另外請注意,'X-Forwarded-For' *應該*包含所有的代理,包括原來的客戶端,用逗號分隔。當然,這不可靠。 'UserHostAddress'只會給你鏈中的最新地址,這往往是客戶端和服務器之間的最後一個路由器。如果你可以避免使用IP地址,那麼這樣做 - 這是不可靠和煩人的。 – Luaan

回答

2

這裏是在平均時間

public string StripPortFromEndPoint(string endPoint) 
{ 
    var splitList = endPoint.Split(':'); 
    if (splitList.Length > 2) 
    { 
     endPoint = IPAddress.Parse(endPoint).ToString(); 
    } 
    else if (splitList.Length == 2) 
    { 
     endPoint = splitList[0]; 
    } 
    else 
    { 
     throw new ParseException("No port separator found",0); 
    } 

    return endPoint; 
}