2013-10-10 206 views
53

我想要使用我的网站的客户端的公共IP地址。 下面的代码显示了局域网中的本地IP,但我想要客户端的公共IP。如何在C#中获取用户的公共IP地址

//get mac address 
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
String sMacAddress = string.Empty; 
foreach (NetworkInterface adapter in nics) 
{ 
    if (sMacAddress == String.Empty)// only return MAC Address from first card 
    { 
     IPInterfaceProperties properties = adapter.GetIPProperties(); 
     sMacAddress = adapter.GetPhysicalAddress().ToString(); 
    } 
} 
// To Get IP Address 


string IPHost = Dns.GetHostName(); 
string IP = Dns.GetHostByName(IPHost).AddressList[0].ToString(); 

输出:

IP地址:192.168.1.7

请帮助我获得的公共IP地址。

+0

@Parker尽管他的代码看起来像重复,但他确实在问ASP.NET和获取客户端地址,这非常可行。 –

+0

你好,有没有什么理由在你接近一年半后不接受我的回答?如果你故意这样做,会很高兴收到你的评论。谢谢。 – FeliceM

回答

66

这是我用:

protected void GetUser_IP() 
{ 
    string VisitorsIPAddr = string.Empty; 
    if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) 
    { 
     VisitorsIPAddr = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); 
    } 
    else if (HttpContext.Current.Request.UserHostAddress.Length != 0) 
    { 
     VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress; 
    } 
    uip.Text = "Your IP is: " + VisitorsIPAddr; 
} 

“UIP”是在aspx页面显示用户IP标签的名称。

+0

未将对象引用设置为对象的实例。 if(HttpContext.Request.ServerVariables [“HTTP_X_FORWARDED_FOR”]!= null) –

+0

String direction =“”; WebRequest请求= WebRequest.Create(“http://checkip.dyndns.org/”); (StreamReader stream = new StreamReader(response.GetResponseStream()))使用(WebResponse response = request.GetResponse()) direction = stream.ReadToEnd(); } //在html中搜索IP int first = direction.IndexOf(“Address:”)+ 9; int last = direction.LastIndexOf(“”); 方向=方向。子字符串(第一,最后 - 第一); 返回方向; 这有助于我,但它是从其他网站采取,如果万一该网站是比什么? –

+0

你是什么意思?你测试了我在答案中给出的代码吗?它正在我所有的网站上工作。让我知道你把代码放在哪里。这可能是问题 – FeliceM

1

在MVC IP可以通过下面的代码

string ipAddress = Request.ServerVariables["REMOTE_ADDR"]; 
+0

未将对象引用设置为对象的实例。 得到这个错误 –

20

您可以使用 “HTTP_X_FORWARDED_FOR” 或 “REMOTE_ADDR” 标题属性来获得。

Machine Syntax blog .

/// <summary> 
    /// method to get Client ip address 
    /// </summary> 
    /// <param name="GetLan"> set to true if want to get local(LAN) Connected ip address</param> 
    /// <returns></returns> 
    public static string GetVisitorIPAddress(bool GetLan = false) 
    { 
     string visitorIPAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

     if (String.IsNullOrEmpty(visitorIPAddress)) 
      visitorIPAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 

     if (string.IsNullOrEmpty(visitorIPAddress)) 
      visitorIPAddress = HttpContext.Current.Request.UserHostAddress; 

     if (string.IsNullOrEmpty(visitorIPAddress) || visitorIPAddress.Trim() == "::1") 
     { 
      GetLan = true; 
      visitorIPAddress = string.Empty; 
     } 

     if (GetLan && string.IsNullOrEmpty(visitorIPAddress)) 
     { 
       //This is for Local(LAN) Connected ID Address 
       string stringHostName = Dns.GetHostName(); 
       //Get Ip Host Entry 
       IPHostEntry ipHostEntries = Dns.GetHostEntry(stringHostName); 
       //Get Ip Address From The Ip Host Entry Address List 
       IPAddress[] arrIpAddress = ipHostEntries.AddressList; 

       try 
       { 
        visitorIPAddress = arrIpAddress[arrIpAddress.Length - 2].ToString(); 
       } 
       catch 
       { 
        try 
        { 
         visitorIPAddress = arrIpAddress[0].ToString(); 
        } 
        catch 
        { 
         try 
         { 
          arrIpAddress = Dns.GetHostAddresses(stringHostName); 
          visitorIPAddress = arrIpAddress[0].ToString(); 
         } 
         catch 
         { 
          visitorIPAddress = "127.0.0.1"; 
         } 
        } 
       } 

     } 


     return visitorIPAddress; 
    } 
+0

我试过在Azure虚拟机上,而'arrIpAddress [0]'包含IPv6地址什么是合适的'String',因此'Catch'没有执行,结果我们得到的是IPv6而不是本地IPv4或127.0.0.1 。 IPv4保存在'arrIpAddress [1]'中。我应该如何处理这个问题才能在这种情况下获得IPv4? – Megrez7

5

所以很多这些代码片段的参考方法GetVisitorIPAddress是非常大的,可能混淆新的程序员寻求帮助。

这个简单而紧凑的代码如何获取访问者的IP地址?

string ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
     if (string.IsNullOrEmpty(ip)) 
     { 
      ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
     } 

简单,短小而紧凑。

1
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress; 
11

所有这些建议的组合,以及背后的原因。随意添加更多测试用例。如果获得客户端IP是最重要的,那么您可能会想要让所有论文进行一些比较,从而得出更准确的结果。

在这个线程的所有建议,简单的检查,再加上我自己的一些代码...

using System.IO; 
    using System.Net; 

    public string GetUserIP() 
    { 
     string strIP = String.Empty; 
     HttpRequest httpReq = HttpContext.Current.Request; 

     //test for non-standard proxy server designations of client's IP 
     if (httpReq.ServerVariables["HTTP_CLIENT_IP"] != null) 
     { 
      strIP = httpReq.ServerVariables["HTTP_CLIENT_IP"].ToString(); 
     } 
     else if (httpReq.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) 
     { 
      strIP = httpReq.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); 
     } 
     //test for host address reported by the server 
     else if 
     (
      //if exists 
      (httpReq.UserHostAddress.Length != 0) 
      && 
      //and if not localhost IPV6 or localhost name 
      ((httpReq.UserHostAddress != "::1") || (httpReq.UserHostAddress != "localhost")) 
     ) 
     { 
      strIP = httpReq.UserHostAddress; 
     } 
     //finally, if all else fails, get the IP from a web scrape of another server 
     else 
     { 
      WebRequest request = WebRequest.Create("http://checkip.dyndns.org/"); 
      using (WebResponse response = request.GetResponse()) 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       strIP = sr.ReadToEnd(); 
      } 
      //scrape ip from the html 
      int i1 = strIP.IndexOf("Address: ") + 9; 
      int i2 = strIP.LastIndexOf("</body>"); 
      strIP = strIP.Substring(i1, i2 - i1); 
     } 
     return strIP; 
    } 
4

我有一个扩展方法:

public static string GetIp(this HttpContextBase context) 
{ 
    if (context == null || context.Request == null) 
     return string.Empty; 

    return context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 
      ?? context.Request.UserHostAddress; 
} 

注:“HTTP_X_FORWARDED_FOR”是IP的背后代理。 context.Request.UserHostAddress与“REMOTE_ADDR”相同。

但请记住,虽然并不需要实际的IP。

来源:

IIS Server Variables

Link

1

只是用这个..................

public string GetIP() 
{ 
    string externalIP = ""; 
    externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/"); 
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")).Matches(externalIP)[0].ToString(); 
    return externalIP; 
} 
+2

描述更多请... –

+7

你不能在asp.net项目中使用它,因为总是返回服务器的ip地址! –

8

对于Web应用程序(ASP.NET MVC和WebForm)

/// <summary> 
/// Get current user ip address. 
/// </summary> 
/// <returns>The IP Address</returns> 
public static string GetUserIPAddress() 
{ 
    var context = System.Web.HttpContext.Current; 
    string ip = String.Empty; 

    if (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) 
     ip = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); 
    else if (!String.IsNullOrWhiteSpace(context.Request.UserHostAddress)) 
     ip = context.Request.UserHostAddress; 

    if (ip == "::1") 
     ip = "127.0.0.1"; 

    return ip; 
} 

对于Windows应用程序(Windows窗体,控制台,Windows服务,...)

static void Main(string[] args) 
    { 
     HTTPGet req = new HTTPGet(); 
     req.Request("http://checkip.dyndns.org"); 
     string[] a = req.ResponseBody.Split(':'); 
     string a2 = a[1].Substring(1); 
     string[] a3=a2.Split('<'); 
     string a4 = a3[0]; 
     Console.WriteLine(a4); 
     Console.ReadLine(); 
    } 
3

我的版本可以同时处理ASP.NET或局域网IP:

/** 
* Get visitor's ip address. 
*/ 
public static string GetVisitorIp() { 
    string ip = null; 
    if (HttpContext.Current != null) { // ASP.NET 
     ip = string.IsNullOrEmpty(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) 
      ? HttpContext.Current.Request.UserHostAddress 
      : HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    } 
    if (string.IsNullOrEmpty(ip) || ip.Trim() == "::1") { // still can't decide or is LAN 
     var lan = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(r => r.AddressFamily == AddressFamily.InterNetwork); 
     ip = lan == null ? string.Empty : lan.ToString(); 
    } 
    return ip; 
} 
2
private string GetClientIpaddress() 
    { 
     string ipAddress = string.Empty; 
     ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
     if (ipAddress == "" || ipAddress == null) 
     { 
      ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
      return ipAddress; 
     } 
     else 
     { 
      return ipAddress; 
     } 
    } 
2

在MVC 5您可以使用此:

string cIpAddress = Request.UserHostAddress; //Gets the client ip address 

string cIpAddress = Request.ServerVariables["REMOTE_ADDR"]; //Gets the client ip address 
0

我们连接到提供给我们外部IP地址的服务器,并尝试从返回的HTML页面解析IP。但是,当服务器在这些页面上稍作改动或删除它们时,这些方法会停止正常工作。

下面是使用它已经活了多年,并迅速返回一个简单的响应服务器需要的外部IP地址的方法... https://www.codeproject.com/Tips/452024/Getting-the-External-IP-Address

Private string getExternalIp() 
{ 
try 
{ 
    string externalIP; 
    externalIP = (new 
    WebClient()).DownloadString("http://checkip.dyndns.org/"); 
    externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) 
       .Matches(externalIP)[0].ToString(); 
    return externalIP; 
} 
catch { return null; } 
} 

VB.NET

Imports System.Net 
Private Function GetExternalIp() As String 
Try 
    Dim ExternalIP As String 
    ExternalIP = (New WebClient()).DownloadString("http://checkip.dyndns.org/") 
    ExternalIP = (New Regex("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) _ 
       .Matches(ExternalIP)(0).ToString() 
    Return ExternalIP 
Catch 
    Return Nothing 
End Try 

End Function

0

lblmessage.Text = Request.ServerVariables [“REMOTE_HOST”]。ToString();

+0

感谢您使用此代码段,这可能会提供一些有限的即时帮助。通过展示*为什么*这是一个很好的解决方案,并且使它对未来的读者更有用,一个正确的解释[将大大提高](// meta.stackexchange.com/q/114762)其长期价值其他类似的问题。请[编辑]你的答案以添加一些解释,包括你所做的假设。 –