Get user location by IP address

前端 未结 14 1142
深忆病人
深忆病人 2020-11-28 02:23

I have an ASP.NET website written in C#.

On this site I need to automatically show a start page based on the user\'s location.

Can I get name of user\'s city

相关标签:
14条回答
  • 2020-11-28 02:50

    It's good sample for you:

    public class IpProperties
        {
            public string Status { get; set; }
            public string Country { get; set; }
            public string CountryCode { get; set; }
            public string Region { get; set; }
            public string RegionName { get; set; }
            public string City { get; set; }
            public string Zip { get; set; }
            public string Lat { get; set; }
            public string Lon { get; set; }
            public string TimeZone { get; set; }
            public string ISP { get; set; }
            public string ORG { get; set; }
            public string AS { get; set; }
            public string Query { get; set; }
        }
     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;
        }
    
        public IpProperties GetCountryByIP(string ipAddress)
        {
            string ipResponse = IPRequestHelper("http://ip-api.com/xml/" + ipAddress);
            using (TextReader sr = new StringReader(ipResponse))
            {
                using (System.Data.DataSet dataBase = new System.Data.DataSet())
                {
                    IpProperties ipProperties = new IpProperties();
                    dataBase.ReadXml(sr);
                    ipProperties.Status = dataBase.Tables[0].Rows[0][0].ToString();
                    ipProperties.Country = dataBase.Tables[0].Rows[0][1].ToString();
                    ipProperties.CountryCode = dataBase.Tables[0].Rows[0][2].ToString();
                    ipProperties.Region = dataBase.Tables[0].Rows[0][3].ToString();
                    ipProperties.RegionName = dataBase.Tables[0].Rows[0][4].ToString();
                    ipProperties.City = dataBase.Tables[0].Rows[0][5].ToString();
                    ipProperties.Zip = dataBase.Tables[0].Rows[0][6].ToString();
                    ipProperties.Lat = dataBase.Tables[0].Rows[0][7].ToString();
                    ipProperties.Lon = dataBase.Tables[0].Rows[0][8].ToString();
                    ipProperties.TimeZone = dataBase.Tables[0].Rows[0][9].ToString();
                    ipProperties.ISP = dataBase.Tables[0].Rows[0][10].ToString();
                    ipProperties.ORG = dataBase.Tables[0].Rows[0][11].ToString();
                    ipProperties.AS = dataBase.Tables[0].Rows[0][12].ToString();
                    ipProperties.Query = dataBase.Tables[0].Rows[0][13].ToString();
    
                    return ipProperties;
                }
            }
        }
    

    And test:

    var ipResponse = GetCountryByIP("your ip address or domain name :)");
    
    0 讨论(0)
  • 2020-11-28 02:51
        public static string GetLocationIPAPI(string ipaddress)
        {
            try
            {
                IPDataIPAPI ipInfo = new IPDataIPAPI();
                string strResponse = new WebClient().DownloadString("http://ip-api.com/json/" + ipaddress);
                if (strResponse == null || strResponse == "") return "";
                ipInfo = JsonConvert.DeserializeObject<IPDataIPAPI>(strResponse);
                if (ipInfo == null || ipInfo.status.ToLower().Trim() == "fail") return "";
                else return ipInfo.city + "; " + ipInfo.regionName + "; " + ipInfo.country + "; " + ipInfo.countryCode;
            }
            catch (Exception)
            {
                return "";
            }
        }
    
    public class IPDataIPINFO
    {
        public string ip { get; set; }
        public string city { get; set; }
        public string region { get; set; }
        public string country { get; set; }
        public string loc { get; set; }
        public string postal { get; set; }
        public int org { get; set; }
    
    }
    

    ==========================

        public static string GetLocationIPINFO(string ipaddress)
        {            
            try
            {
                IPDataIPINFO ipInfo = new IPDataIPINFO();
                string strResponse = new WebClient().DownloadString("http://ipinfo.io/" + ipaddress);
                if (strResponse == null || strResponse == "") return "";
                ipInfo = JsonConvert.DeserializeObject<IPDataIPINFO>(strResponse);
                if (ipInfo == null || ipInfo.ip == null || ipInfo.ip == "") return "";
                else return ipInfo.city + "; " + ipInfo.region + "; " + ipInfo.country + "; " + ipInfo.postal;
            }
            catch (Exception)
            {
                return "";
            }
        }
    
    public class IPDataIPAPI
    {
        public string status { get; set; }
        public string country { get; set; }
        public string countryCode { get; set; }
        public string region { get; set; }
        public string regionName { get; set; }
        public string city { get; set; }
        public string zip { get; set; }
        public string lat { get; set; }
        public string lon { get; set; }
        public string timezone { get; set; }
        public string isp { get; set; }
        public string org { get; set; }
        public string @as { get; set; }
        public string query { get; set; }
    }
    

    ==============================

        private static string GetLocationIPSTACK(string ipaddress)
        {
            try
            {
                IPDataIPSTACK ipInfo = new IPDataIPSTACK();
                string strResponse = new WebClient().DownloadString("http://api.ipstack.com/" + ipaddress + "?access_key=XX384X1XX028XX1X66XXX4X04XXXX98X");
                if (strResponse == null || strResponse == "") return "";
                ipInfo = JsonConvert.DeserializeObject<IPDataIPSTACK>(strResponse);
                if (ipInfo == null || ipInfo.ip == null || ipInfo.ip == "") return "";
                else return ipInfo.city + "; " + ipInfo.region_name + "; " + ipInfo.country_name + "; " + ipInfo.zip;
            }
            catch (Exception)
            {
                return "";
            }
        }
    
    public class IPDataIPSTACK
    {
        public string ip { get; set; }
        public int city { get; set; }
        public string region_code { get; set; }
        public string region_name { get; set; }
        public string country_code { get; set; }
        public string country_name { get; set; }
        public string zip { get; set; }
    
    
    }
    
    0 讨论(0)
  • 2020-11-28 02:54

    Use http://ipinfo.io , You need to pay them if you make more than 1000 requests per day.

    The code below requires the Json.NET package.

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

    And the IpInfo Class I used:

    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; }
    }
    
    0 讨论(0)
  • 2020-11-28 02:54

    I have tried using http://ipinfo.io and this JSON API works perfectly. First, you need to add the below mentioned namespaces:

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

    For localhost it will give dummy data as AU. You can try hardcoding your IP and get results:

    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;
            }
    
    
        }
    }
    
    0 讨论(0)
  • 2020-11-28 02:56

    An Alternative to using an API is to use HTML 5 location Navigator to query the browser about the User location. I was looking for a similar approach as in the subject question but I found that HTML 5 Navigator works better and cheaper for my situation. Please consider that your scinario might be different. To get the User position using Html5 is very easy:

    function getLocation()
    {
        if (navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition(showPosition);
        }
        else
        {
            console.log("Geolocation is not supported by this browser.");
         }
    }
    
    function showPosition(position)
    {
          console.log("Latitude: " + position.coords.latitude + 
      "<br>Longitude: " + position.coords.longitude); 
    }
    

    Try it yourself on W3Schools Geolocation Tutorial

    0 讨论(0)
  • 2020-11-28 02:57

    You'll probably have to use an external API, most of which cost money.

    I did find this though, seems to be free: http://hostip.info/use.html

    0 讨论(0)
提交回复
热议问题