J’ai un site Web ASP.NET écrit en C #.
Sur ce site, je dois afficher automatiquement une page de démarrage en fonction de l’emplacement de l’utilisateur.
Puis-je obtenir le nom de la ville de l’utilisateur en fonction de l’adresse IP de l’utilisateur?
Vous avez besoin d’une API de géocodage inverse basée sur l’adresse IP … comme celle de ipdata.co . Je suis sûr qu’il y a beaucoup d’options disponibles.
Vous voudrez peut-être permettre à l’utilisateur de remplacer cela, cependant. Par exemple, ils peuvent être sur un réseau privé virtuel d’entreprise, ce qui fait que l’adresse IP ressemble à celle d’un pays différent.
Utilisez http://ipinfo.io , vous devez les payer si vous faites plus de 1000 demandes par jour.
Le code ci-dessous nécessite le package Json.NET .
public static ssortingng GetUserCountryByIp(ssortingng ip) { IpInfo ipInfo = new IpInfo(); try { ssortingng info = new WebClient().DownloadSsortingng("http://ipinfo.io/" + ip); ipInfo = JsonConvert.DeserializeObject(info); RegionInfo myRI1 = new RegionInfo(ipInfo.Country); ipInfo.Country = myRI1.EnglishName; } catch (Exception) { ipInfo.Country = null; } return ipInfo.Country; }
Et la classe IpInfo I utilisée:
public class IpInfo { [JsonProperty("ip")] public ssortingng Ip { get; set; } [JsonProperty("hostname")] public ssortingng Hostname { get; set; } [JsonProperty("city")] public ssortingng City { get; set; } [JsonProperty("region")] public ssortingng Region { get; set; } [JsonProperty("country")] public ssortingng Country { get; set; } [JsonProperty("loc")] public ssortingng Loc { get; set; } [JsonProperty("org")] public ssortingng Org { get; set; } [JsonProperty("postal")] public ssortingng Postal { get; set; } }
IPInfoDB a une API que vous pouvez appeler pour trouver un emplacement basé sur une adresse IP.
Pour “City Precision”, vous l’appelez comme ceci (vous devrez vous enregistrer pour obtenir une clé API gratuite):
http://api.ipinfodb.com/v2/ip_query.php?key=&ip=74.125.45.100&timezone=false
Voici un exemple dans VB et C # qui montre comment appeler l’API.
Après le code travaille pour moi.
Comme j’appelle une demande d’API gratuite (base json) IpStack .
public static ssortingng CityStateCountByIp(ssortingng IP) { var url = "http://freegeoip.net/json/" + IP; var request = System.Net.WebRequest.Create(url); using (WebResponse wrs = request.GetResponse()) using (Stream stream = wrs.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { ssortingng json = reader.ReadToEnd(); var obj = JObject.Parse(json); var City = (ssortingng)obj["city"]; // - For Country = (ssortingng)obj["region_name"]; //- For CountryCode = (ssortingng)obj["country_code"]; return (City); } return ""; }
Edit: Premièrement, c’était http://freegeoip.net/ maintenant son https://ipstack.com/ (peut-être maintenant un service payant)
J’ai essayé d’utiliser http://ipinfo.io et cette API JSON fonctionne parfaitement. Tout d’abord, vous devez append les espaces de noms mentionnés ci-dessous:
using System.Linq; using System.Web; using System.Web.UI.WebControls; using System.Net; using System.IO; using System.Xml; using System.Collections.Specialized;
Pour localhost, il fournira des données factices comme AU
. Vous pouvez essayer de coder votre IP en dur et obtenir des résultats:
namespace WebApplication4 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ssortingng VisitorsIPAddr = ssortingng.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"].ToSsortingng(); } else if (HttpContext.Current.Request.UserHostAddress.Length != 0) { VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress;`enter code here` } ssortingng res = "http://ipinfo.io/" + VisitorsIPAddr + "/city"; ssortingng ipResponse = IPRequestHelper(res); } public ssortingng IPRequestHelper(ssortingng url) { ssortingng checkURL = url; HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); StreamReader responseStream = new StreamReader(objResponse.GetResponseStream()); ssortingng responseRead = responseStream.ReadToEnd(); responseRead = responseRead.Replace("\n", Ssortingng.Empty); responseStream.Close(); responseStream.Dispose(); return responseRead; } } }
Vous devrez probablement utiliser une API externe, dont la plupart coûtent de l’argent.
Je l’ai trouvé cependant, semble être gratuit: http://hostip.info/use.html
J’ai pu y parvenir avec ASP.NET MVC en utilisant l’adresse IP du client et l’API freegeoip.net . freegeoip.net est gratuit et ne nécessite aucune licence.
Vous trouverez ci-dessous l’exemple de code que j’ai utilisé.
Ssortingng UserIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (ssortingng.IsNullOrEmpty(UserIP)) { UserIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } ssortingng url = "http://freegeoip.net/json/" + UserIP.ToSsortingng(); WebClient client = new WebClient(); ssortingng jsonssortingng = client.DownloadSsortingng(url); dynamic dynObj = JsonConvert.DeserializeObject(jsonssortingng); System.Web.HttpContext.Current.Session["UserCountryCode"] = dynObj.country_code;
Vous pouvez parcourir ce post pour plus de détails.
static public ssortingng GetCountry() { return new WebClient().DownloadSsortingng("http://api.hostip.info/country.php"); }
Usage:
Console.WriteLine(GetCountry()); // will return short code for your country
static public ssortingng GetInfo() { return new WebClient().DownloadSsortingng("http://api.hostip.info/get_json.php"); }
Usage:
Console.WriteLine(GetInfo()); // Example: // { // "country_name":"COUNTRY NAME", // "country_code":"COUNTRY CODE", // "city":"City", // "ip":"XX.XXX.XX.XXX" // }
Ce que vous avez besoin s’appelle une “firebase database géo-IP”. La plupart d’entre eux coûtent de l’argent (même si ce n’est pas trop cher), surtout assez précis. L’un des plus utilisés est la firebase database MaxMind . Ils ont une version assez bonne de la firebase database IP-to-city appelée GeoLity City – elle a beaucoup de ressortingctions, mais si vous pouvez y faire face, ce sera probablement votre meilleur choix, à moins d’avoir un peu d’argent pour un abonnement à produit plus précis.
Et oui, ils ont une API C # pour interroger les bases de données géo-IP disponibles.
Utilisation de la demande du site Web suivant
Voici le code C # pour renvoyer le code pays et pays
public ssortingng GetCountryByIP(ssortingng ipAddress) { ssortingng strReturnVal; ssortingng 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.ToSsortingng(); // Contry strReturnVal += "(" + responseXML.Item(0).ChildNodes[2].InnerText.ToSsortingng() + ")"; // Contry Code return strReturnVal; }
Et la suite est Helper pour demander url.
public ssortingng IPRequestHelper(ssortingng url) { HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); StreamReader responseStream = new StreamReader(objResponse.GetResponseStream()); ssortingng responseRead = responseStream.ReadToEnd(); responseStream.Close(); responseStream.Dispose(); return responseRead; }
C’est un bon échantillon pour vous:
public class IpProperties { public ssortingng Status { get; set; } public ssortingng Country { get; set; } public ssortingng CountryCode { get; set; } public ssortingng Region { get; set; } public ssortingng RegionName { get; set; } public ssortingng City { get; set; } public ssortingng Zip { get; set; } public ssortingng Lat { get; set; } public ssortingng Lon { get; set; } public ssortingng TimeZone { get; set; } public ssortingng ISP { get; set; } public ssortingng ORG { get; set; } public ssortingng AS { get; set; } public ssortingng Query { get; set; } } public ssortingng IPRequestHelper(ssortingng url) { HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); StreamReader responseStream = new StreamReader(objResponse.GetResponseStream()); ssortingng responseRead = responseStream.ReadToEnd(); responseStream.Close(); responseStream.Dispose(); return responseRead; } public IpProperties GetCountryByIP(ssortingng ipAddress) { ssortingng ipResponse = IPRequestHelper("http://ip-api.com/xml/" + ipAddress); using (TextReader sr = new SsortingngReader(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].ToSsortingng(); ipProperties.Country = dataBase.Tables[0].Rows[0][1].ToSsortingng(); ipProperties.CountryCode = dataBase.Tables[0].Rows[0][2].ToSsortingng(); ipProperties.Region = dataBase.Tables[0].Rows[0][3].ToSsortingng(); ipProperties.RegionName = dataBase.Tables[0].Rows[0][4].ToSsortingng(); ipProperties.City = dataBase.Tables[0].Rows[0][5].ToSsortingng(); ipProperties.Zip = dataBase.Tables[0].Rows[0][6].ToSsortingng(); ipProperties.Lat = dataBase.Tables[0].Rows[0][7].ToSsortingng(); ipProperties.Lon = dataBase.Tables[0].Rows[0][8].ToSsortingng(); ipProperties.TimeZone = dataBase.Tables[0].Rows[0][9].ToSsortingng(); ipProperties.ISP = dataBase.Tables[0].Rows[0][10].ToSsortingng(); ipProperties.ORG = dataBase.Tables[0].Rows[0][11].ToSsortingng(); ipProperties.AS = dataBase.Tables[0].Rows[0][12].ToSsortingng(); ipProperties.Query = dataBase.Tables[0].Rows[0][13].ToSsortingng(); return ipProperties; } } }
Et test:
var ipResponse = GetCountryByIP("your ip address or domain name :)");
Une alternative à l’utilisation d’une API consiste à utiliser le navigateur d’emplacement HTML 5 pour interroger le navigateur sur l’emplacement de l’utilisateur. Je cherchais une approche similaire à celle du sujet mais j’ai trouvé que HTML 5 Navigator fonctionnait mieux et moins cher pour ma situation. Veuillez considérer que votre scinario pourrait être différent. Pour obtenir la position User en utilisant Html5, c’est très simple:
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 + "
Longitude: " + position.coords.longitude); }
Essayez-le vous-même sur le tutoriel de géolocalisation W3Schools
vous pouvez
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)) { ssortingng json = reader.ReadToEnd(); var obj = JObject.Parse(json); var City = (ssortingng)obj["city"]; // - For Country = (ssortingng)obj["region_name"]; //- For CountryCode = (ssortingng)obj["country_code"]; Session["CurrentRegionName"]= (ssortingng)obj["country_name"]; Session["CurrentRegion"] = (ssortingng)obj["country_code"]; } return RedirectToAction("Index"); }