Obtener el nombre del equipo cliente con ASP.NET

Es posible obtener información sobre el equipo desde el que se conecta un cliente a una página web utilizando el objeto Request. Este objeto nos proporciona información sobre lenguajes aceptados, versión del navegador, la dirección ip y el nombre del equipo entre otros. Más adelante comentaré alguna cuestión referente a la dirección IP, pero ahora vamos a centrarnos en lo que nos ocupa, que es el nombre del equipo. Para este dato se utiliza la propiedad UserHostName, la cual nos devuelve el nombre DNS obtenido a partir de una resolución inversa de la dirección IP. Sin embargo, hay situaciones en las que esta propiedad no nos proporciona el dato correcto. En algunas ocasiones nos devolverá la misma dirección ip, y en otras, nos devolverá el nombre de una servidor intermedio que puede estar actuando como proxy. Veamos a qué se deben estos problemas y cómo resolverlos.

Cuando UserHostName nos devuelve el mismo valor que la dirección IP del cliente, obtenida mediante UserHostAdress, es señal de que la resolución inversa de DNS puede no estar activada en el servidor de IIS. Si tenemos acceso a la configuración del servidor podemos activarla fácilmente, aunque siendo conscientes de que supone una merma en los recursos del servidor y produce que las peticiones se resuelvan de forma algo más lenta, razones por las cuales en muchas ocasiones esta opción está desactivada.

En el caso de que no podamos acceder a la configuración del servidor, o no queramos realizar el cambio necesario en la configuración, sigue siendo posible obtener el nombre del cliente con algo de código.

System.Net.IPHostEntry hostEntry = System.Net.Dns.GetHostByName(Request.UserHostAddress);
// tenemos el nombre del equipo cliente en hostEntry.HostName

Utilizamos el método GetHostByName pasándole como parámetro la dirección IP que queremos resolver. Este código es válido para .NET 1.1, pero si estamos utilizando .NET 2.0, este método está marcado como obsoleto y deberíamos utilizar GetHostEntry.

Una pega que tiene este código es que las operaciones de comunicación con los DNS son algo lentas, por lo que normalmente producirán que se detenga momentaneamente el flujo de ejecución de la página. Para resolverlo podemos utilizar el método de forma asíncrona, con lo que se creará automáticamente un nuevo hilo de ejecución encargado de realizar la resolución, y que correrá en paralelo con el resto de ejecución de la página.

protected void Page_Load(object sender, EventArgs e)
{
   // llamamos a GetHostByName de forma asíncrona, indicando como callback
   // el método GetHostNameCallBack, e indicando que queremos que se pase
   // a dicho método como información de estado la dirección ip que hemos 
   // pedido resolver
   System.Net.Dns.BeginGetHostByName(Request.UserHostAddress, new AsyncCallback(GetHostNameCallBack), Request.UserHostAddress);
}
 
public void GetHostNameCallBack(IAsyncResult asyncResult)
{
   string userHostAddress = (string)asyncResult.AsyncState;
 System.Net.IPHostEntry hostEntry = System.Net.Dns.EndGetHostByName(asyncResult);
   // tenemos el nombre del equipo cliente en hostEntry.HostName
}

En el anterior código, dentro del método page_load, llamamos al métodoGetHostByName de forma asíncrona, indicándole que cuando finalice la ejecución del método se llame a GetHostNameCallBack. Si quieres saber más sobre el funcionamiento de los delegados, hilos, o llamadas asíncronas, te recomiendo la lectura de este artítulo previo: «Realización de llamadas asíncronas a delegados«.

Hemos visto cómo actuar cuando UserHostName nos devuelve el mismo valor que la dirección IP del cliente, pero hay otra situación en la que nos puede proporcionar información no del todo correcta. En casos en los que la petición del cliente haya pasado por proxies intermedios, la propiedad UserHostAddress puede no contener la dirección ip real del cliente sino la dirección IP de un proxy intermedio. Si este es el caso, es necesario antes de utilizar el anterior método, obtener la dirección ip real del cliente y utilizarla como parámetro en la llamada a GetHostByName. Para obtener esta dirección es necesario mirar algunas de las cabeceras indicadas en Request.ServerVariables. En este artículo previo explico el funcionamiento de estas cabeceras e indico una función en PHP que trabaja con ellas para obtener la dirección ip real del cliente. La traslación desde el código PHP a .NET es bastante directa, por lo que la dejo como ejercicio para el que le apetezca.

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

3 Respuestas para “Obtener el nombre del equipo cliente con ASP.NET”

  1. EXCELENTE ARTICULO, MUY PROFESIONAL, COMPLETO. GRACIAS Y SIGE ASI. 🙂

  2. Excelente artículo.
    Acá le paso el código en visual basic.net poniendo el resultado en un label.

    Inherits System.Web.UI.Page
    Dim Semaforo As System.Threading.ManualResetEvent = New System.Threading.ManualResetEvent(False)

    Protected Sub PlaceHolder1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles PlaceHolder1.PreRender

    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Semaforo.Reset()
    System.Net.Dns.BeginGetHostEntry(Request.UserHostAddress, AddressOf GetHostNameCallBack, Request.UserHostAddress)
    Semaforo.WaitOne()

    End Sub

  3. Patty Rodriguez 27. Sep, 2012 en 9:56 pm

    Muchas gracias por este post, me has resuelto mi problema!! 😛