Как получить общеansible IP-адрес пользователя в C #

Я хочу публичный IP-адрес клиента, который использует мой сайт. В приведенном ниже коде показан локальный IP-адрес в локальной сети, но я хочу публичный 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-адрес.

Это то, что я использую:

 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-адрес пользователя.

Вы можете использовать атрибут заголовка “HTTP_X_FORWARDED_FOR” или “REMOTE_ADDR”.

Обратитесь к методу GetVisitorIPAddress из блога синтаксиса.

  ///  /// method to get Client ip address ///  ///  set to true if want to get local(LAN) Connected ip address ///  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; } 

Сочетание всех этих предложений и причин, лежащих в их основе. Не стесняйтесь добавлять больше тестовых примеров. Если получение 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(""); strIP = strIP.Substring(i1, i2 - i1); } return strIP; } 

Этот код получает IP-адрес вашего сервера, а не адрес клиента, который обращается к вашему сайту. Используйте свойство HttpContext.Current.Request.UserHostAddress для IP-адреса клиента.

Для веб-приложений (ASP.NET MVC и WebForm)

 ///  /// Get current user ip address. ///  /// The IP Address 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 Form, консоль, служба 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(); } 

Таким образом, многие из этих fragmentов кода действительно большие и могут запутать новых программистов, которые ищут помощь.

Как насчет этого простого и компактного кода для получения 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"]; } 

Простой, короткий и компактный.

У меня есть метод расширения:

 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

Ссылка

Моя версия обрабатывает IP-адреса ASP.NET или LAN:

 /** * 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; } 
  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; } } 

На MVC 5 вы можете использовать это:

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

или

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

В MVC IP может быть получен следующий код

 string ipAddress = Request.ServerVariables["REMOTE_ADDR"]; 
 string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress; 

просто используйте это ………………

 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; } 

Мы подключаемся к серверам, которые предоставляют нам наш внешний IP-адрес и пытаются проанализировать IP-адрес из возвращаемых HTML-страниц. Но когда серверы делают небольшие изменения на этих страницах или удаляют их, эти методы перестают работать исправно.

Вот метод, который принимает внешний IP-адрес с помощью сервера, который был жив в течение многих лет и быстро возвращает простой ответ … https://www.codeproject.com/Tips/452024/Getting-the-External-IP- Адрес

 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 

Конечная функция

 lblmessage.Text =Request.ServerVariables["REMOTE_HOST"].ToString(); 
  • Точное измерение времени для тестирования производительности
  • Какую платформу разработки .NET Dependency Injection стоит посмотреть?
  • Будут ли исключения C ++ безопасно распространяться через C-код?
  • Не удалось создать миграции после обновления до ASP.NET Core 2.0
  • Hashtable с многомерным ключом в C #
  • Почему C-массив имеет неправильное значение sizeof (), когда он передается функции?
  • «On Exit» для консольного приложения
  • В чем основное отличие между int.Parse () и Convert.ToInt32
  • Расширение C: ? операторы
  • Могу ли я полагаться на malloc, возвращающий NULL?
  • Вопрос с интервью: проверьте, является ли одна строка rotationм другой строки
  • Давайте будем гением компьютера.