Geolocalizando direcciones IP con C#

Conocer a nuestros usuarios es cada vez más importante para poder ofrecerles servicios más ajustados a sus necesidades.

Cuando estamos trabajando con una aplicacion web existen herramientas como Google Analytics que nos permiten recabar todo tipo de información (también podemos usar Google Analytics con aplicaciones de escritorio) , pero hay veces que necesitamos conocer detalles como la ubicación del usuario en el momento de interactuar con él, y no sólo a posteriori para realizar análisis estádísticos.

Una de las cosas que nos puede ayudar a mejorar la experiencia de usuario es conocer el lugar en el que se encuentra el usuario.

En HTML5 existe un api de geolocalización, pero no siempre está disponible y, además, requiere del consentimiento del usuario.

Otra opción es utilizar lo que se conoce como geolocalización de IP, que consisten en tratar de averiguar la ubicación del usuario basándonos en su dirección IP. Esto no es completamente fiable porque el usuario puede acceder a través de un proxy o usar una IP que está físicamente alejada de su ubicación real (la IP está realmente asociada al ISP no al equipo del usuario), pero en muchas ocasiones es suficiente.

Geolocalizando una IP

Para conocer la ubicación del usuario existen muchos servicios, pero en este post vamos a ver uno muy simple y, además, gratuito (con ciertos límites): IPInfoDB.

El servicio ofrecido por IPInfoIDB requiere que nos registremos para conseguir un API KEY, pero este registro es completamente gratuito.

Una vez completado el registro, el código necesario para geolocalizar una IP en C# es muy sencillo:

public Location GeoLocate(string ip)
{
    const string API_KEY = "YOUR_API_KEY";

    var url = "http://api.ipinfodb.com/v3/ip-city/?key={0}&ip={1}&format=xml";
	
    var doc = XDocument.Load(string.Format(url, API_KEY, ip));

    return new Location
    {
        CountryCode = doc.Descendants("countryCode").First().Value,
        CountryName = doc.Descendants("countryName").First().Value,
        Region = doc.Descendants("regionName").First().Value,
        City = doc.Descendants("cityName").First().Value,
        ZipCode = doc.Descendants("zipCode").First().Value,
        Latitude = decimal.Parse(doc.Descendants("latitude").First().Value, CultureInfo.InvariantCulture),
        Longitude = decimal.Parse(doc.Descendants("longitude").First().Value, CultureInfo.InvariantCulture)
    };
}

Como véis no hay mucha complicación, cargamos en un documento XML los datos devueltos por el servicio y construimos un objeto Location a partir de la información contenida en el documento XML.

No tan rápido

Antes de empezar a usar este código en tu próxima aplicación, hay que tener en cuenta algunas limitaciones:

  • El código anterior es código de demo. No hay ningún tipo de control de errores, y lo último que querrías es que tu aplicación dejase de funcionar porque el servicio de IPInfoDB está caído. Una buena opción cuando uno se integra con este tipo de servicios es aplicar el patrón disyuntor (circuit breaker).
  • Utilizar esta técnica para geolocalizar IPs requiere una llamada a un servidor externo, y esa llamada puede ser más lenta de lo que nos gustaría. Es importante tenerlo en cuenta y sería muy recomendable realizarla de forma asíncrona (y con un timeout, por cierto) para evitar bloquear nuestra aplicación eternamente.

Conclusiones

Geolocalizar una IP usando C# es muy sencillo con servicios como IPInfoDB y puede ayudarnos a hacer aplicaciones más inteligentes que resulten más agradables de utilizar para nuestros usuarios, pero no hay que olvidar que estamos introduciendo una dependencia sobre un servicio externo y hay infinidad de cosas que pueden salir mal, por lo que nuestra aplicación deberá estar preparada para tratar con estas contingencias.

Un comentario en “Geolocalizando direcciones IP con C#

  1. Que tal, quisiera saber si hay alguna aplicación (o si es ésta) de escritorio el la que pueda saber la ubicación geográfica de una lista de diracciones ip para su posterior análisis. Gracias!

Comentarios cerrados.