Blog alskare

.Net y lo que surja

Obtener información de una IP

Posted by alskare en 25/01/2009

Jugando con el tema del consumo de servicios Web, me encuentro un servicio que permite obtener, en base a una dirección IP, su localización geográfica. La dirección de los servicios es : http://www.webservicex.net/geoipservice.asmx

Creación de la aplicación

Ya que trabajo poco con C#, opto por hacer las pruebas, precisamente con este lenguaje, así nos vamos familiarizando un poco con él. Siempre me ha apetecido dar el salto de VB a C#, pero mantengo demasiadas aplicaciones en VBA, VB6 y VB.Net como para empezar a habituarme.

Pues eso, creamos una aplicación de C# WinForms para ver los resultados:

image

Dentro de Proyecto | Agregar referencia Web haremos referencia al servicio que usaremos en la aplicación:

image

En este caso podemos apreciar como sólo tenemos un servicio disponible en el servidor, GetGeoIPContext y una clase, GetGeoIP que, como veremos más adelante, se encargará de encapsular la información devuelta por las operaciones del servicio.

Preparación del entorno

Creamos un formulario que tendrá doble utilidad. Por un lado, permitirá al usuario introducir la dirección IP que quiere consultar y, por otro, mostrará los datos que se extraigan de la clase GetGeoIP.

image

Los datos de respuesta son todos los que vienen incluidos en la clase GetGeoIP, salvo el DomainName, que lo he incluido de “cosecha propia” gracias a la inmensa librería de clases de .NetFramework.

El programa

Al final del artículo se incluye la aplicación completa, por tanto, sólo se hace mención especial a los fragmentos de código más característicos de la aplicación.

Comprobar que la Ip introducida es correcta

Creo una función que permite comprobar que la IP que introduce el usuario es una IP válida, haciendo uso del método TryParse de la clase System.Net.IPAddress:

/// <summary>
/// Confirma que la dirección IP sea válida. 
/// </summary>
/// <param name="Ip">string introducido por el usuario</param>
/// <returns>En caso de introducir 2 es válido, puesto que toma 0.0.0.2</returns>
private bool ConfirmIP(string Ip)
{
    System.Net.IPAddress ipTemp = null;
    return System.Net.IPAddress.TryParse(Ip, out ipTemp);
}

Es importante destacar, en el código anterior, que una dirección del tipo 12.12 será considerada como válida, puesto que la interpretará como 0.0.12.12.

Para obtener el nombre del servidor, hacemos uso de la clase System.Net.Dns, concretamente, del método estático GetHostEntry.

/// <summary>
/// Devuelve el nombre del servidor asociado a la IP.
/// </summary>
/// <returns></returns>
private string GetInfoServer()
{
    IPHostEntry ip = Dns.GetHostEntry(txtIpIn.Text);
    return ip.HostName;
}

 

Por tanto, una vez definidos los campos estáticos de la clase,

// Clase de WebService que contiene información de la localización de una IP.
private wsWhois.GeoIP IpInfo;

// Clase de WebService que permite consultar una Ip.
private wsWhois.GeoIPService wsService;

// Nombre del Servidor.
private string serverName = null;

Sólo quedará hacer una llamada al servicio GetGeoIPContext y escribir los datos resultantes:

private void cmdGo_Click(object sender, EventArgs e)
{
    IpInfo = null;
    WriteInfo();
    if (!ConfirmIP(this.txtIpIn.Text))
    {
        MessageBox.Show("Invalid IP Address");
    }
    else
    {
        //Get info from Country of Ip
        wsService = new wsWhois.GeoIPService();
        IpInfo = wsService.GetGeoIP(this.txtIpIn.Text);

        // GetInfo From Domain
        serverName = GetInfoServer();

        WriteInfo();
    }
}

Incluyo también el método writeInfo que, por lo menos a mí, me llama la atención por la sencillez y potencia del operador ternario para poder mostrar los datos en el caso que nos encontremos con resultados correctos o bien, una “limpieza” de los controles del formulario en el caso que no se haya recibido una respuesta correcta:

/// <summary>
/// Muestra la información resultante en pantalla o limpia los datos del formulario
/// </summary>
private void WriteInfo()
{
    bool resultOk = IpInfo != null;

    this.txtIp.Text = (resultOk) ? IpInfo.IP : string.Empty;
    this.txtCountryCode.Text = (resultOk) ? IpInfo.CountryCode.ToString() : string.Empty;
    this.txtCountryName.Text = (resultOk) ? IpInfo.CountryName : string.Empty;
    this.txtReturnCode.Text = (resultOk) ? IpInfo.ReturnCode.ToString() : string.Empty;
    this.txtReturnCodeDetails.Text = (resultOk) ? IpInfo.ReturnCodeDetails : string.Empty;
    this.txtDomainName.Text = (resultOk) ? serverName : string.Empty;
}

 

Dejo el enlace al proyecto completo. Yo supongo que sí que irá, pero es la primera vez que tenía que dejar un archivo, así que he optado por dejarlo en SkyDrive y colocar el enlace desde aquí. Ahora me queda probar si puedo subir ficheros directamente en WordPress.

Descarga del enlace: aquí

Sorry, the comment form is closed at this time.

 
A %d blogueros les gusta esto: