Get user location by IP address

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

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

Can I get the user's city name based on the user's IP address?

+69
Dec 01 '10 at 18:18
source share
15 answers

You need an IP reverse geocoding API based on IP address ... like in ipdata.co . I am sure there are many options.

However, you can allow the user to override this. For example, they can be in a corporate VPN, which makes the IP address look like in another country.

+40
Dec 01 '10 at 18:21
source share

Use http://ipinfo.io , you need to pay 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 that 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; } } 
+21
Aug 08 '16 at 11:37
source share

IPInfoDB has an API that you can call to find a location based on an IP address.

For City Precision, you call it that (you need to register to get a free API key):

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

Here is an example in VB and C # that shows how to call an API.

+13
Dec 01 '10 at 18:22
source share

The following code works for me.

Upadate

As I call the free API request (json base) 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 ""; } 

Edit: Firstly, it was http://freegeoip.net/ now its https://ipstack.com/ (maybe now a paid service)

+12
Aug 02 '16 at 12:50
source share

I tried using http://ipinfo.io and this JSON API is working fine. First, you need to add the following 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, this will give dummy data as AU . You can try hard-coding your IP address and get the 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; } } } 
+7
Sep 24 '14 at 11:58
source share

I was able to achieve this in ASP.NET MVC using the client IP address and the freegeoip.net API. freegeoip.net is free and does not require any license.

Below is an example of the code that I used.

 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; 

You can go through this post for more details. Hope this helps!

+6
Oct 09 '15 at 5:53 on
source share

You may have to use an external API, most of which costs money.

I found this, although it seems to be free: http://hostip.info/use.html

+5
Dec 01 '10 at 18:21
source share

What you need is called a geo-IP base. Most of them cost money (although not too expensive), especially quite accurate ones. One of the most widely used MaxMind database . They have a pretty good free version of the IP-to-city database called GeoLity City - it has a lot of limitations, but if you handle this it will probably be your best choice if you don’t have the money to subscribe for a more accurate product .

And, yes, they have a C # API for querying geo-IP databases .

+4
Dec 01 '10 at 18:30
source share

Return country

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

Using:

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

Refund Information

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

Using:

 Console.WriteLine(GetInfo()); // Example: // { // "country_name":"COUNTRY NAME", // "country_code":"COUNTRY CODE", // "city":"City", // "ip":"XX.XXX.XX.XXX" // } 
+4
Jul 26 '12 at 18:07
source share

Using the request for the following website

http://ip-api.com/

Below is the C # code to return the country and country code

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

And further - Helper for requesting a 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
Apr 04 '15 at 9:53 on
source share

This is a 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 the test:

 var ipResponse = GetCountryByIP("your ip address or domain name :)"); 
+2
Aug 21 '15 at 10:53 on
source share

An alternative to using the API is to use the HTML 5 Location Navigator to request the browser about the user's location. I was looking for the same approach as in the subject matter, but found that HTML 5 Navigator works better and cheaper for my situation. Please note that your scenario may be different. Getting a user's 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 at the W3Schools Geolocation Tutorial

+1
Jun 01. '13 at 4:21
source share

I cannot comment because of the low reputation, but if you want this, try the first answer using this URL: http://ip-api.com/json/

0
Jan 24 '19 at 14:04
source share
  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
Mar 23 '19 at 20:23
source share

You can

 using System.Net; using System.IO; using Newtonsoft.Json.Linq; public ActionResult geoPlugin() { var url = "http://freegeoip.net/json/"; 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); var City = (string)obj["city"]; // - For Country = (string)obj["region_name"]; //- For CountryCode = (string)obj["country_code"]; Session["CurrentRegionName"]= (string)obj["country_name"]; Session["CurrentRegion"] = (string)obj["country_code"]; } return RedirectToAction("Index"); } 
-one
Dec 14 '17 at 0:31
source share



All Articles