使用 C# 和 WPF 获取 IP 地理位置
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20117294/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get IP geolocation using C# & WPF
提问by user3016854
I am doing a module which can display my city, state, latitude and longitude, using IP address of the device I am using. However, I can't get it right. Below, there is my code which I referred to another website:
我正在做一个模块,它可以使用我正在使用的设备的 IP 地址显示我的城市、州、纬度和经度。但是,我无法正确理解。下面是我参考另一个网站的代码:
internal GeoLoc GetMyGeoLocation()
{
try
{
//create a request to geoiptool.com
var request = WebRequest.Create(new Uri("http://geoiptool.com/data.php")) as HttpWebRequest;
if (request != null)
{
//set the request user agent
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727)";
//get the response
using (var webResponse = (request.GetResponse() as HttpWebResponse))
if (webResponse != null)
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
//get the XML document
var doc = new XmlDocument();
doc.Load(reader);
//now we parse the XML document
var nodes = doc.GetElementsByTagName("marker");
Guard.AssertCondition(nodes.Count > 0,"nodes",new object());
//make sure we have nodes before looping
//if (nodes.Count > 0)
//{
//grab the first response
var marker = nodes[0] as XmlElement;
Guard.AssertNotNull(marker, "marker");
//get the data and return it
_geoLoc.City = marker.GetAttribute("city");
_geoLoc.Country = marker.GetAttribute("country");
_geoLoc.Code = marker.GetAttribute("code");
_geoLoc.Host = marker.GetAttribute("host");
_geoLoc.Ip = marker.GetAttribute("ip");
_geoLoc.Latitude = marker.GetAttribute("lat");
_geoLoc.Lognitude = marker.GetAttribute("lng");
_geoLoc.State = GetMyState(_geoLoc.Latitude, _geoLoc.Lognitude);
return _geoLoc;
//}
}
}
// this code would only be reached if something went wrong
// no "marker" node perhaps?
return new GeoLoc();
}
catch (Exception ex)
{
throw;
}
}
}
All the code has no problem. The only problem would be the _geoLoc, it keep prompt out red lines below each of them. What does it mean? Thank you.
所有的代码都没有问题。唯一的问题是_geoLoc,它会在每条线下方提示红线。这是什么意思?谢谢你。
采纳答案by Joe
As others have pointed out, _geoLoc isn't defined. Try something like this
正如其他人指出的那样, _geoLoc 没有定义。尝试这样的事情
internal GeoLoc GetMyGeoLocation()
{
try
{
//create a request to geoiptool.com
var request = WebRequest.Create(new Uri("http://geoiptool.com/data.php")) as HttpWebRequest;
if (request != null)
{
//set the request user agent
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727)";
//get the response
using (var webResponse = (request.GetResponse() as HttpWebResponse))
if (webResponse != null)
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
//get the XML document
var doc = new XmlDocument();
doc.Load(reader);
//now we parse the XML document
var nodes = doc.GetElementsByTagName("marker");
Guard.AssertCondition(nodes.Count > 0,"nodes",new object());
//make sure we have nodes before looping
//if (nodes.Count > 0)
//{
//grab the first response
var marker = nodes[0] as XmlElement;
Guard.AssertNotNull(marker, "marker");
var _geoLoc = new GeoLoc();
//get the data and return it
_geoLoc.City = marker.GetAttribute("city");
_geoLoc.Country = marker.GetAttribute("country");
_geoLoc.Code = marker.GetAttribute("code");
_geoLoc.Host = marker.GetAttribute("host");
_geoLoc.Ip = marker.GetAttribute("ip");
_geoLoc.Latitude = marker.GetAttribute("lat");
_geoLoc.Lognitude = marker.GetAttribute("lng");
_geoLoc.State = GetMyState(_geoLoc.Latitude, _geoLoc.Lognitude);
return _geoLoc;
//}
}
}
// this code would only be reached if something went wrong
// no "marker" node perhaps?
return new GeoLoc();
}
catch (Exception ex)
{
throw;
}
}
回答by JSJ
Seems like you dont have instenciated _geoLoc this should be instenciatted before you use it. try something like.
好像你没有 instenciated _geoLoc 这应该在你使用它之前进行 instenciatted。尝试类似的东西。
namespace MyNamespace
{
public class GeoLoc
{
public string City { get; set; }
public string Country { get; set; }
public string Code { get; set; }
public string Host { get; set; }
public string Ip { get; set; }
public string Latitude { get; set; }
public string Lognitude { get; set; }
public object State { get; set; }
}
public class TestGEO
{
internal GeoLoc GetMyGeoLocation()
{
GeoLoc _geoLoc = new GeoLoc();
try
{
//create a request to geoiptool.com
var request = WebRequest.Create(new Uri("http://geoiptool.com/data.php")) as HttpWebRequest;
if (request != null)
{
//set the request user agent
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727)";
//get the response
using (var webResponse = (request.GetResponse() as HttpWebResponse))
if (webResponse != null)
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
//get the XML document
var doc = new XmlDocument();
doc.Load(reader);
//now we parse the XML document
var nodes = doc.GetElementsByTagName("marker");
// Guard.AssertCondition(nodes.Count > 0, "nodes", new object());
//make sure we have nodes before looping
//if (nodes.Count > 0)
//{
//grab the first response
var marker = nodes[0] as XmlElement;
// Guard.AssertNotNull(marker, "marker");
//get the data and return it
_geoLoc.City = marker.GetAttribute("city");
_geoLoc.Country = marker.GetAttribute("country");
_geoLoc.Code = marker.GetAttribute("code");
_geoLoc.Host = marker.GetAttribute("host");
_geoLoc.Ip = marker.GetAttribute("ip");
_geoLoc.Latitude = marker.GetAttribute("lat");
_geoLoc.Lognitude = marker.GetAttribute("lng");
_geoLoc.State = GetMyState(_geoLoc.Latitude, _geoLoc.Lognitude);
return _geoLoc;
//}
}
}
// this code would only be reached if something went wrong
// no "marker" node perhaps?
return _geoLoc;
}
catch (Exception ex)
{
throw;
}
}
private object GetMyState(string p, string p_2)
{
///do somting
return "State Name";
//return you data;
}
}
}

