sábado 25 de febrero de 2012

CrossDomain SecurityException accediendo a mi Servicio WCF en Azure WCF desde Silverlight

Acabo de subir una Rol Web de Servicio WCF a Azure con la idea de acceder a el desde un web part Silverlight, pero me saltó la temida y casi esperada:
System.ServiceModel.CommunicationException: An error occurred while trying to make a request to URI 'http://localhost:81/MyService.svc'. 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 cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details. ---> System.Security.SecurityException ---> System.Security.SecurityException: Security error.
Vale, bien, pero ¿Cómo añado mi fichero crossdomain.xml o el clientaccesspolicy.xml a un “Rol Web de Azure” que acabo de enterarme de que existe?

Para mi sorpresa es muy fácil sólo tienes que añadir los XMLs al proyecto:

añadiendo crossdomain.xml and clientaccesspolicy.xml a rol web azure

Después de esto podrás depurar el código y después de que actualices el paquete en el "Hosted Service" de Azure podrás acceder sin problemas desde tu Silverlight.

Por cierto, ¿todo el tema este de la gestión de Azure está traducido al castellano?

lunes 20 de febrero de 2012

MessageBox, DialogBox y ventanas Popup en Silverlight con el control ChildWindow

Ya sé que esto lleva ahí desde Silverlight 3, ¡pero yo no lo sabía! ¿De verdad? No me lo puedo creer...

Así que para mi esto es nuevo, y tiene muy buena pinta. Yo siempre había creado controles de usuario para estas cosas, pero este ChildWindow tiene hasta animaciones…

Crearlo es tan simple como añadir un elemento de este tipo a nuestro proyecto:

Crear una nueva Silverlight Child Window
Después solo tienes que modificar un poco el XAML para que tenga el aspecto que necesitas y listo.

Para usarlo tienes que crear el objeto y mostrarlo así:
MessageWindow window = new MessageWindow("Info!", string.Format("This is a ChildWindow example."), true);
window.Show();

Como siempre, hay un problema. Los objetos MessageBox o DialogBox paran el hilo esperando una respuesta, mientras que el control ChildWindow no (esto también es bueno en algunos casos, de hecho he notado últimamente que los MessageBox consumen un montón de recursos) así que si necesitas usar la respuesta que el usuario ha seleccionado en tu ChildWindow tendrás que suscribirte al evento Close, algo como esto:
MessageWindow window = new MessageWindow("Info!", string.Format("This is a ChildWindow example."), true);
window.Show();

window.Closed += (sndr, args) =>
{
    if (window.DialogResult == true)
    {
        StratexWS.GetFBAUsersAsync();
        LoadingWindow.Show();
    }
};

Yo he cambiado un poco el código por defecto. Me ha quedado así::

Ejemplo de ChildWindow
Por cierto, hay por lo menos otro problema. Estos controles no funcionan si se llaman en el constructor… solo funcionan después de que el control haya cargado completamente (http://vanderbiest.org/blog/2010/08/03/silverlight-4-childwindow-is-not-visible/)