2013-11-21 30 views
1

我正在做一个模块,可以使用我使用的设备的IP地址显示我的城市,州,经度和纬度。 但是,我不明白。下面,还有就是我的代码,我提到另一个网站:使用C#和WPF获取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; 
} 

}

所有的代码都没有问题。唯一的问题是_geoLoc,它保持提示下面的每个红线。这是什么意思?谢谢。

+0

什么是变量'_geoLoc'和它在哪里初始化? –

+0

如果你的红线'_geoLoc',这意味着变量没有在你的类中声明或初始化。 – SridharVenkat

回答

0

正如其他人指出的,_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; 
    } 
} 
+0

感谢您的建议。它帮助了很多。请问我该如何在TextBlock上显示结果? – user3016854

+0

从方法调用获得结果后,可以将TextBlock的文本设置为在GeoLoc对象上使用属性。 – Joe

+0

是否TextBlock.Text = _geoLoc.City.Value.ToString(); ? – user3016854

0

好像你没有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; 
     } 
    } 
} 
+0

感谢您的建议。请问如何显示我在TextBlock上得到的结果? – user3016854

+0

覆盖GeoLoc类中的ToString方法,并将数据格式设置为字符串。类。或者您可以使用geoloc.propertyname来显示您想要的内容。 – JSJ

+0

是否TextBlock.Text = _geoLoc.City.Value.ToString(); ? – user3016854