Ich habe eine ASP.NET-Website in C # geschrieben.
Auf dieser Site muss automatisch eine Startseite angezeigt werden, die auf dem Standort des Benutzers basiert.
Kann ich den Namen der Stadt des Benutzers basierend auf der IP-Adresse des Benutzers erhalten?
Rest Api
überprüfen Sie freegeoip.net oder geoplugin.net , oder überprüfen Sie dies und diesen Beitrag, Hoffnung hilft jemandem.Antworten:
Sie benötigen eine IP-Adress-basierte Reverse-Geocodierungs-API ... wie die von ipdata.co . Ich bin sicher, es gibt viele Möglichkeiten.
Möglicherweise möchten Sie dem Benutzer jedoch erlauben, dies zu überschreiben. Sie können sich beispielsweise in einem Unternehmens-VPN befinden, wodurch die IP-Adresse so aussieht, als ob sie sich in einem anderen Land befindet.
quelle
Verwenden Sie http://ipinfo.io . Sie müssen sie bezahlen, wenn Sie mehr als 1000 Anfragen pro Tag stellen.
Der folgende Code erfordert das Json.NET- Paket.
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; }
Und die
IpInfo
Klasse, die ich benutzt habe: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; } }
quelle
Der folgende Code funktioniert für mich.
Aktualisieren:
Da rufe ich eine kostenlose API-Anfrage (json base) IpStack auf .
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 ""; }
Bearbeiten: Zuerst war es http://freegeoip.net/ jetzt ist es https://ipstack.com/ (und jetzt ist es vielleicht ein kostenpflichtiger Service - Kostenlos Bis zu 10.000 Anfragen / Monat)
quelle
json
durchxml
in der Adresse, um eine XML-Rückgabestruktur zu erhalten.IPInfoDB verfügt über eine API , die Sie aufrufen können, um anhand einer IP-Adresse einen Speicherort zu finden.
Für "City Precision" nennen Sie es so (Sie müssen sich registrieren, um einen kostenlosen API-Schlüssel zu erhalten):
http://api.ipinfodb.com/v2/ip_query.php?key=<your_api_key>&ip=74.125.45.100&timezone=false
Hier ist ein Beispiel in VB und C #, das zeigt, wie die API aufgerufen wird.
quelle
Ich habe versucht, http://ipinfo.io zu verwenden, und diese JSON-API funktioniert einwandfrei. Zunächst müssen Sie die folgenden Namespaces hinzufügen:
using System.Linq; using System.Web; using System.Web.UI.WebControls; using System.Net; using System.IO; using System.Xml; using System.Collections.Specialized;
Für localhost werden Dummy-Daten als angegeben
AU
. Sie können versuchen, Ihre IP-Adresse fest zu codieren, um Ergebnisse zu erhalten: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; } } }
quelle
Ich konnte dies in ASP.NET MVC mithilfe der Client-IP-Adresse und der freegeoip.net- API erreichen. freegeoip.net ist kostenlos und erfordert keine Lizenz.
Unten ist der Beispielcode, den ich verwendet habe.
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;
Sie können diesen Beitrag für weitere Details durchgehen. Hoffentlich hilft es!
quelle
Verwenden der Anfrage der folgenden Website
http://ip-api.com/
Es folgt der C # -Code für die Rückgabe von Land und Ländercode
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; }
Und im Folgenden finden Sie einen Helfer zum Anfordern einer 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; }
quelle
Was Sie benötigen, wird als "Geo-IP-Datenbank" bezeichnet. Die meisten von ihnen kosten etwas Geld (wenn auch nicht zu teuer), besonders ziemlich präzise. Eine der am häufigsten verwendeten ist die MaxMind-Datenbank . Sie haben eine ziemlich gute kostenlose Version der IP-to-City-Datenbank namens GeoLity City - es gibt viele Einschränkungen, aber wenn Sie damit fertig werden, wäre dies wahrscheinlich die beste Wahl, es sei denn, Sie haben etwas Geld für ein Abonnement übrig genaueres Produkt.
Und ja, sie haben eine C # -API, um verfügbare Geo-IP-Datenbanken abzufragen .
quelle
Sie müssen wahrscheinlich eine externe API verwenden, von der die meisten Geld kosten.
Ich habe dies jedoch gefunden, scheint kostenlos zu sein: http://hostip.info/use.html
quelle
Rückkehrland
static public string GetCountry() { return new WebClient().DownloadString("http://api.hostip.info/country.php"); }
Verwendung:
Console.WriteLine(GetCountry()); // will return short code for your country
Informationen zurückgeben
static public string GetInfo() { return new WebClient().DownloadString("http://api.hostip.info/get_json.php"); }
Verwendung:
Console.WriteLine(GetInfo()); // Example: // { // "country_name":"COUNTRY NAME", // "country_code":"COUNTRY CODE", // "city":"City", // "ip":"XX.XXX.XX.XXX" // }
quelle
Es ist eine gute Probe für Sie:
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; } } }
Und testen:
var ipResponse = GetCountryByIP("your ip address or domain name :)");
quelle
Eine Alternative zur Verwendung einer API ist die Verwendung des HTML 5-Standortnavigators, um den Browser nach dem Benutzerstandort abzufragen. Ich suchte nach einem ähnlichen Ansatz wie in der Betrefffrage, stellte jedoch fest, dass HTML 5 Navigator für meine Situation besser und billiger funktioniert. Bitte beachten Sie, dass Ihr Szenario anders sein kann. Die Benutzerposition mit HTML5 zu ermitteln ist sehr einfach:
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); }
Probieren Sie es selbst im W3Schools Geolocation Tutorial aus
quelle
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; } }
quelle
Sie können
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"); }
quelle