Get client IP in Silverlight application.

 

http://www.michaelsnow.com/2010/04/29/silverlight-tip-of-the-day-9-obtaining-your-clients-ip-address/

Bueno, siguiendo los consejos del amigo Michael, decido hacer un WCF. Pero yo me pregunto, con lo facilito que era en ASP.NET, total era una mísera línea del Http.Context. Pero claro, ahora en SL, hay que complicarlo, ellos sabrán el porque, supongo que temas de seguridad, de sandbox, y otras gaitas.

Nada, pues sigo, me pongo con mi WCF, lo creo hago un “rename” del IService1 y el Service1, a IMyService y MyService, creo mis métodos, compilo, referencio mi nuevo webservice en una máquina remota, y peta!

¿Qué pasa? Todo parece correcto. Media horita más tarde, se me ocurre mirar si el refactoring ha hecho el “rename” correctamente. ¡Vaya por dios!, se ha dejado un par de sitios sin cambiar.

Lo cambio a mano y ya puedo referenciar.

Perfecto, lo referencio en una aplicación WF para probar, y como no, nuevo problema.

public string GetCustomerIP()
        {
            string customerIP = System.Web.HttpContext.Current.Request.UserHostAddress;
          
            return customerIP;
        }

El HttpContext.Current es “null”. Vaya, pues vamos a mirar que pasa. Un ratito más y resulta que faltan un par de líneas:

[ServiceBehavior]

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class MyService : IMyService
    {

……

}

y en el web.config

<serviceHostingEnvironment multipleSiteBindingsEnabled=”true” aspNetCompatibilityEnabled=”true”   />

Ale, ya me devuelve la IP. Este Michael se ha dejado una parte importante de configuración.

Bueno, no pasa nada, sigo y referencio ahora el WCF en una web Silverlight. Y como no, otro error. Este más raro que un perro verde.

“This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a …….. etc. etc. etc”

Socorrooooo!!! ¡Pero si iba bien en WF! ¿qué pasa ahora? Nada, otro ratito a navegar por google. Otra vez problemas de seguridad, cómo nos complican los hackers.

La solución parece sencilla, crear en el directorio IIS raíz del WCf, el fichero clientaccesspolicy.xml con el contenido:

<access-policy>
 
    <cross-domain-access>
 
        <policy>
 
            <allow-from http-request-headers=”*”>
 
                <domain uri=”*”/>
 
            </allow-from>
 
            <grant-to>
 
                <resource path=”/” include-subpaths=”true”/>
 
            </grant-to>
 
        </policy>
 
    </cross-domain-access>
 
</access-policy>

Pero nada, el error sigue, y sigue, ¿posible problema con la caché del IIS? Pues nada, lo reinicio. Pero sigue el error.

Gracias a Fiddler, me doy cuenta que no busca en ese directorio. ¿Y si muevo el xml al raiz, en mi caso en C:\inetpub\wwwroot? Noooo. sigue el error. Pero el fichero ya lo coge correctamente!. Último intento, reinicio IIS.

Síííííííííííííííííííííííííííííí!!!!!!!!!!!!!!!

Funciona, mi WCF, referenciado desde SL, me devuelve al fin la IP del cliente.

ServiceReference1.MyServiceClient client = new ServiceReference1.MyServiceClient();
           client.GetCustomerIPCompleted += new EventHandler<ServiceReference1.GetCustomerIPCompletedEventArgs>(client_GetCustomerIPCompleted);
           client.GetCustomerIPAsync();

 

Tras maldecir a los dioses y unas horitas de navegación (por google, que no en barca) se ha solucionado el problema. Pero Michael, en tu próximo blog, explayate un poquito más. De todos modos, gracias.

Ale, ¿véis que fácil es coger la ip del cliente? ¡¡¡No quiero pensar si en la próxima versión lo complicarán un poquito más!!!

Sonrisa Prueba superada!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s