Получить местоположение пользователя по IP-адресу - PullRequest
69 голосов
/ 01 декабря 2010

У меня есть сайт ASP.NET, написанный на C #.

На этом сайте мне нужно автоматически показывать стартовую страницу в зависимости от местоположения пользователя.

Могу ли я получить название города пользователя на основе IP-адреса пользователя?

Ответы [ 14 ]

40 голосов
/ 01 декабря 2010

Вам необходим API обратного геокодирования на основе IP-адреса ... например, от ipdata.co .Я уверен, что есть много доступных вариантов.

Однако вы можете разрешить пользователю отменять это.Например, они могут быть в корпоративной VPN, которая делает IP-адрес похожим на , как будто он находится в другой стране.

21 голосов
/ 08 августа 2016

Используйте http://ipinfo.io, вам нужно платить, если вы делаете более 1000 запросов в день.

Для приведенного ниже кода требуется пакет Json.NET .

 public static string GetUserCountryByIp(string ip)
        {
            IpInfo ipInfo = new IpInfo();
            try
            {
                string info = new WebClient().DownloadString("http://ipinfo.io/" + ip);
                ipInfo = JsonConvert.DeserializeObject<IpInfo>(info);
                RegionInfo myRI1 = new RegionInfo(ipInfo.Country);
                ipInfo.Country = myRI1.EnglishName;
            }
            catch (Exception)
            {
                ipInfo.Country = null;
            }

            return ipInfo.Country;
        }

И класс IpInfo, который я использовал:

public class IpInfo
    {

    [JsonProperty("ip")]
    public string Ip { get; set; }

    [JsonProperty("hostname")]
    public string Hostname { get; set; }

    [JsonProperty("city")]
    public string City { get; set; }

    [JsonProperty("region")]
    public string Region { get; set; }

    [JsonProperty("country")]
    public string Country { get; set; }

    [JsonProperty("loc")]
    public string Loc { get; set; }

    [JsonProperty("org")]
    public string Org { get; set; }

    [JsonProperty("postal")]
    public string Postal { get; set; }
}
13 голосов
/ 01 декабря 2010

IPInfoDB имеет API , который вы можете вызвать, чтобы найти местоположение на основе IP-адреса.

Для "City Precision" вы называете это так (вам нужно зарегистрироваться, чтобы получить бесплатный ключ API):

 http://api.ipinfodb.com/v2/ip_query.php?key=<your_api_key>&ip=74.125.45.100&timezone=false

Вот пример в VB и C #, который показывает, как вызывать API.

12 голосов
/ 02 августа 2016

Следующий Кодекс работает для меня.

Upadate

Поскольку я вызываю бесплатный запрос API (база json) IpStack .

    public static string CityStateCountByIp(string IP)
    {
      //var url = "http://freegeoip.net/json/" + IP;
      //var url = "http://freegeoip.net/json/" + IP;
        string url = "http://api.ipstack.com/" + IP + "?access_key=[KEY]";
        var request = System.Net.WebRequest.Create(url);

         using (WebResponse wrs = request.GetResponse())
         using (Stream stream = wrs.GetResponseStream())
         using (StreamReader reader = new StreamReader(stream))
         {
          string json = reader.ReadToEnd();
          var obj = JObject.Parse(json);
            string City = (string)obj["city"];
            string Country = (string)obj["region_name"];                    
            string CountryCode = (string)obj["country_code"];

           return (CountryCode + " - " + Country +"," + City);
           }

  return "";

}

Редактировать: Во-первых, это был http://freegeoip.net/, теперь его https://ipstack.com/ (возможно, теперь платная услуга)

7 голосов
/ 24 сентября 2014

Я попытался использовать http://ipinfo.io, и этот JSON API работает отлично. Во-первых, вам нужно добавить следующие пространства имен:

using System.Linq;
using System.Web; 
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using System.Xml;
using System.Collections.Specialized;

Для localhost он выдаст фиктивные данные как AU. Вы можете попробовать установить свой IP-адрес и получить результаты:

namespace WebApplication4
{
    public partial class WebForm1 : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
         {

          string VisitorsIPAddr = string.Empty;
          //Users IP Address.                
          if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
          {
              //To get the IP address of the machine and not the proxy
              VisitorsIPAddr =   HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
          }
          else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
          {
              VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress;`enter code here`
          }

          string res = "http://ipinfo.io/" + VisitorsIPAddr + "/city";
          string ipResponse = IPRequestHelper(res);

        }

        public string IPRequestHelper(string url)
        {

            string checkURL = url;
            HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
            StreamReader responseStream = new StreamReader(objResponse.GetResponseStream());
            string responseRead = responseStream.ReadToEnd();
            responseRead = responseRead.Replace("\n", String.Empty);
            responseStream.Close();
            responseStream.Dispose();
            return responseRead;
        }


    }
}
6 голосов
/ 09 октября 2015

Мне удалось добиться этого в ASP.NET MVC, используя IP-адрес клиента и freegeoip.net API. freegeoip.net бесплатен и не требует никакой лицензии.

Ниже приведен пример кода, который я использовал.

String UserIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(UserIP))
{
    UserIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
string url = "http://freegeoip.net/json/" + UserIP.ToString();
WebClient client = new WebClient();
string jsonstring = client.DownloadString(url);
dynamic dynObj = JsonConvert.DeserializeObject(jsonstring);
System.Web.HttpContext.Current.Session["UserCountryCode"] = dynObj.country_code;

Вы можете просмотреть этот пост для более подробной информации. Надеюсь, это поможет!

5 голосов
/ 01 декабря 2010

Вам, вероятно, придется использовать внешний API, большинство из которых стоит денег.

Я нашел это, хотя, кажется, бесплатно: http://hostip.info/use.html

4 голосов
/ 04 апреля 2015

Используя запрос следующего веб-сайта

http://ip -api.com /

Ниже приведен код C # для возврата кода страны и страны

public  string GetCountryByIP(string ipAddress)
    {
        string strReturnVal;
        string ipResponse = IPRequestHelper("http://ip-api.com/xml/" + ipAddress);

        //return ipResponse;
        XmlDocument ipInfoXML = new XmlDocument();
        ipInfoXML.LoadXml(ipResponse);
        XmlNodeList responseXML = ipInfoXML.GetElementsByTagName("query");

        NameValueCollection dataXML = new NameValueCollection();

        dataXML.Add(responseXML.Item(0).ChildNodes[2].InnerText, responseXML.Item(0).ChildNodes[2].Value);

        strReturnVal = responseXML.Item(0).ChildNodes[1].InnerText.ToString(); // Contry
        strReturnVal += "(" + 

responseXML.Item(0).ChildNodes[2].InnerText.ToString() + ")";  // Contry Code 
 return strReturnVal;
}

И следующий помощник для запроса URL.

public string IPRequestHelper(string url) {

      HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
      HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();

      StreamReader responseStream = new StreamReader(objResponse.GetResponseStream());
      string responseRead = responseStream.ReadToEnd();

      responseStream.Close();
      responseStream.Dispose();

  return responseRead;
}
4 голосов
/ 26 июля 2012

Страна возврата

static public string GetCountry()
{
    return new WebClient().DownloadString("http://api.hostip.info/country.php");
}

Использование:

Console.WriteLine(GetCountry()); // will return short code for your country

Информация о возврате

static public string GetInfo()
{
    return new WebClient().DownloadString("http://api.hostip.info/get_json.php");
}

Использование:

Console.WriteLine(GetInfo()); 
// Example:
// {
//    "country_name":"COUNTRY NAME",
//    "country_code":"COUNTRY CODE",
//    "city":"City",
//    "ip":"XX.XXX.XX.XXX"
// }
4 голосов
/ 01 декабря 2010

То, что вам нужно, называется «база гео-IP». Большинство из них стоит денег (хотя и не слишком дорого), особенно довольно точных. Одна из наиболее широко используемых - это база данных MaxMind . У них есть довольно хорошая бесплатная версия базы данных IP-to-city под названием GeoLity City - она ​​имеет множество ограничений, но если вы справитесь с этим, это, вероятно, будет вашим лучшим выбором, если у вас нет денег сэкономить на подписке на более точный товар.

И да, у них есть API C # для запроса баз данных гео-IP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...