E N D
1. Silverlight 2.0 para desarrolladores(Día 2) Marino Posadas
MVP C#, MCAD, MCSD, MCT
Alhambra-Eidos
3. Parte 3: Comunicaciones fuera de la SandBox
4. Modelo de acceso al DOM desde Silverlight
5. Accediendo al HTML DOM desde el código manejado Acceso a HTML desde un nuevo namespace:
6. Accediendo al Código Manejado desde Scripts Se debe marcar la propiedad, el método ó el evento como Scriptable
7. HTML Integration Otros escenarios de interesantes de integración con HTML
Links persistentes
Integración “Forward/Back“
Seriación JSON
Interacción HTML-Silverlight en los dos sentidos
Creación dinámica de elementos HTML
8. Integración con HTML
9. OpenFile Dialog De momento es el único recurso de este tipo accesible desde una aplicación Silverlight
Permite abrir ficheros mediante una técnica que simula el acceso remoto permitido
Puede desencadenar procesos de espera indeseables si no se manejan los eventos de la IU con cuidado.
10. OpenFile Dialog (1) Silverlight soporta la posibilidad de abrir un cuadro de diálogo para archivos locales
Los desarrolladores pueden trabajar con el contenido de los archivos localmente, sin tener que subir primero todo el archivo al server
11. OpenFile Dialog (2) Recordemos: Silverlight no permite al desarrollador tener el control o acceder al archivo original en la maquina local.
Silverlight no puede tener el acceso directo al archivo sin primero obtenerlo por medio del cuando de dialogo “Abrir Archivo”
Vamos a ver una demo para demostrar un posible problema y su solución
12. Open File Dialog-Uso estándar- Uso mediante el evento CompositionTarget.Rendering
13. Acceso a Datos (mediante Servicios Web)
14. 4 formas de acceso:ASMXWCFREstADO.NET Data Services
15. Servicios Web (ASMX) El generador de proxy de Visual Studio permite un acceso fuertemente tipado
Servicios de ASMX (SOAP), WCF, y REst
ADO.NET Data Services utiliza estos modelos
16. Servicios Web Siempre suponen una llamada asíncrona
17. Trucos: carga dinámica de imágenes(aplicable a ficheros locales o a URI’s) Image image = new Image();
Uri uri = new Uri("images/myImage.png", UriKind.Relative);
ImageSource img = new System.Windows.Media.Imaging.BitmapImage(uri);
image.SetValue(Image.SourceProperty, img)
Mostrar la imagen
<Grid x:Name="MainGrid">
<Canvas x:Name="Map“/>
</Grid>
Añadir la imagen a la IU:
Map.Children.Add(image);
Otra opción consiste en declarar un elemento Image en el fichero XAML
<Image Source="images/MyImage.png"></Image>
18. Servicios Web ASMX(basados en SOAP)
19. Servicios WCF Visual Studio dispone de una plantilla especial para la generación de este tipo de servicios
EL mecanismo similar al anterior, pero los aspectos particulares del “binding” pueden configurarse mejor, caso de ser necesario
Una vez reconocida la existencia del servicio (sistema de descubrimiento de servicios de VS 2008), el proceso es casi idéntico al ASMX
Una de las razones para retocar el “binding” puede ser el rendimiento del servicio (cambiará en cada caso)
20. Servicios WCF
21. Servicios REst No tienen estado ni contrato, por lo que (al menos de momento) no pueden ser descubiertos por el sistema anterior
Presupone el conocimiento de su existencia y las API’s que pone a disposición del usuario
Requiere de un fichero “CrossDomain.xml” en la raíz del servicio donde se establezca el permiso de acceso
Si el modelo es RSS nos valdremos de una clase de ayuda que formatee en lectura la información XML suministrada
La clase es SyndicationFeed
22. Servicios Rest(sin contrato)
23. ADO.NET Data Services Propone un modelo similar a Entity Framework (basado en él, en realidad)
Se genera un modelo de datos en el servidor y –a partir de ahí- un conjunto de clases .NET que ofrecen funcionalidad CRUD sobre ese modelo
El modelo es modificable por el usuario
Sigue un patrón de acceso parecido al de las declaraciones REst
Sobre ese modelo, se crea un servicio WCF que expone la funcionalidad necesaria
En el cliente Silverlight, se crea la referencia al servicio y sus métodos expuestos para manejar los datos
24. ADO.NET Data Services
25. Parte 4: Buenas Prácticas, instalación de aplicaciones, y trucos útiles
26. Gestión de Estados Estados en aplicaciones RIA
Cliente vs. Servidor
Estados en Cliente:
Usa el “isolated storage” para conseguir persistencia de estados durante las sesiones.
Guarda en el cliente y sincroniza con el servidor en intervalos o al final de la sesión
Guarda estados en el servidor solo cuando sea necesario y mejor en un único punto B.D.
27. Validación Datos de entrada ActualmenteSilverlightno tieneun modelo„built-in? de validación
La validación se debe de hacer en el código cliente Silverlight o bién via servicios web en el servidor
Guías:
Identifica fronteras de seguridad en las diferentes capas, valida los datos que cruzan dichas fronteras
En las validaciones del “lado cliente?, pon el código de validación de datos en rutinas separadas de la presentación y de la lógica de negocio
Si es mucho código -> carga asíncronamente
No hagas “eco? de datos de entrada en los que no se confía
Valida en el servidor(Servicios-Web) los datos críticos.
Validación cliente -> Para experiencia de usuario
Validación servidor -> Aspectos reales de seguridad
28. Cache Cache por defecto del Browser para componentes SL, imágenes y datos que no cambian durante la sesión
Usa el “almacén aislado? para guardar estados de aplicación e información de configuración que quieras persistir entre sesiones
Comprueba la cuota del “almacén aislado? antes de escribir información.
Evitar errores
Cuota == 1Mb inicial y 50Mb máximo.
No guardes tipos de datos BLOB en el “almacén aislado?
29. ¿Accesibilidad? Silverlight 2.0 ha mejorado mucho la accesibilidad
Soporte completo al teclado
Decorar elementos XAML de IU con info de Accesibilidad
Soporte de accesibilidad a controles “custom?
Soporte de accesibilidad a lectores(AT)
Accesibilidad “exposición arbol? para UIA
Nota –UIA solo Windows, MacOX no soporta plug-ins accesibles
Crítico en UE: Portales Administración Pública (por Ley en España)
30. Comunicaciones en RIA (Capa Servicios) 2 ó 3 tipos Servicios Web: ASMX, WCF-Basic y REST
Binding SOAP WCF soportado: basicHttpBinding (SOAP 1.1 compatible)
Recuerda aspectos de autorización cross-domain.
Consumo de Servicios-Web desde SL 2.0 Asíncrono
Evita consumir Servicios-Web síncronamente ->bloquea
Si necesitas consumirWS síncronamente -> En otro Thread en background para no bloquear el browser
Opciones para comunicaciones “Push Data” con el servidor:
WCF FullDuplexService basado en basicHttpBinding
Sockets (Mucho mas escalable que HTTP simulando FullDuplex)
Para escalabilidad: Usar sockets en lugar de polling para hacer push de datos desde el servidor al cliente
31. Autenticación y Autorización •Los clientes RIA pueden utilizar mecanismos de autenticación y autorización similares a los clientes web estándar.
•Tener en cuenta aspectos de autorización cross-domain con los ficheros crossdomain.xml ó clientaccesspolicy.xml (políticas de Silverlight) en el servidor web de servicios
•Internet: Usar “Forms authentication? con el sistema ASP.NET Membership, y roles para Autorización.
•Intranet: Usar autenticaciónWindows y roles Windows para autorización. La autenticación Windows no funciona automáticamente para usuarios no Windows (Apple MacOX, etc.)
•Si se autentica contra servicios web (WCF p.e.), recuerda que Silverlight soporta solo basicHttpBinding(SOAP 1.1)
•Para cifrado de la comunicación -> SSL (HTTPS)
32. Cookies y Cross-Site Las Cookies en un mismo nivel de dominio
miorg.com no puede acceder a las cookies foo.com…
Mismo Dominio-> http://miorg.com es diferente de
http://bar. miorg.com ó http://www. miorg.com
Mismo Protocolo -> http:// miorg.com es diferente de
https:// miorg.com
MismoPuerto-> http:// miorg.com es diferente de
https://miorg.com:8080
foo.com tiene que estar ”seguro?
de los datos que guarda en sus cookies
Prevención contra Falsificación
“cross-site’
33. ClientAccessPolicy.xml <?xmlversion="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resourcepath="/" includesubpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
34. Trucos : Activar las “cookies” del navegador Se hace a través del objeto HtmlPage.Document
Utiliza el namespace System.Windows.Browser.
Para establecer la “cookie” se llama a SetProperty() con una cadena en la forma “Key=Valor;expires=FechaExpiración.”
Ejemplo:
private void SetCookie(string clave, string valor) {
// Expira en 7 Dias
DateTime expireDate = DateTime.Now + TimeSpan.FromDays(7);
string newCookie = clave+ "=" + valor + ";expires=" + expireDate.ToString("R"); HtmlPage.Document.SetProperty("cookie", newCookie);
}
35. Trucos : Activar las “cookies” del navegador Para leer la cookie recorremos la propiedad HtmlPage.Document.Cookies.
private string GetCookie(string key){
string[] cookies = HtmlPage.Document.Cookies.Split(';');
foreach (string cookie in cookies)
{
string [] keyValue = cookie.Split('=');
if (keyValue.Length == 2)
{
if(keyValue[0].ToString() == key) return keyValue[1];
}
} return null;
}
36. Trucos: Centrar el control Silverlight en el navegador El control Silverlight va a una tabla con un sola celda o a un div. Añadimos un estilo a la tabla estableciendo los valores de margin-left y margin-right en auto.
La altura y anchura del elemento <td> debe concordar con la del control Silverlight o el control no se mostrará.
Ejemplo:
<body>
<form id="form1" runat="server" style="height: 100%;"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
<table style="margin-left: auto; margin-right: auto;"> <tr> <td style="width: 600px; height: 300px;"> <asp:Silverlight ID="Xaml1" PluginBackground="Transparent" runat="server" Source="~/ClientBin/SilverlightDev.xap" MinimumVersion="2.0.30523" Width="100%" Height="100%" />
</td>
</tr> </table>
</form>
</body>
37. Trucos: Centrar el control Silverlight en el navegador También podemos usar:
<div style="width: 100%; margin: 0">
<div style="margin: auto; width: 600px; height: 300px">
<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/SilverlightDev.xap" MinimumVersion="2.0.30523" Width="100%" Height="100%" />
</div>
</div>
38. Trucos: escalado de elementos Demo On-line: http://silverlight.services.live.com/invoke/66033/Page%20Scaling/iframe.html
Añadir un RenderTransform del tipo ScaleTransform al Grid o Canvas del control Silverlight
<Canvas>
<Canvas.RenderTransform>
<ScaleTransform x:Name="CanvasScale" ScaleX=”1” ScaleY=”1” /> </Canvas.RenderTransform>
</Canvas>
Asignar ScaleX y ScaleY a “1” equivale a 100%.
Establecer el valor de CanvasScale ScaleX y ScaleY a un porcentaje del navegador:
39. Trucos: escalado de elementos namespace ScaleTransform {
public partial class Page : UserControl {
private int _startingWidth = 800;
private int _startingHeight = 600;
public Page() {
InitializeComponent();
App.Current.Host.Content.Resized += new EventHandler(Content_Resized);
}
void Content_Resized(object sender, EventArgs e) {
double height = App.Current.Host.Content.ActualHeight;
double width = App.Current.Host.Content.ActualWidth;
CanvasScale.ScaleX = width / _startingWidth;
CanvasScale.ScaleY = height / _startingHeight;
}
}
}
40. Trucos: lanzar una ventana “popup” Se soporta el método HtmlPage.PopupWindow().
Por seguridad, solo funciona como respuesta a una entrada de usuario.
Referencia a System.Windows.Browser;
La llamada a HtmlPage.PopupWindow() admite 3 parámetros:
Uri (http://www.silverlight.net).
String – Nombre de la ventana
HtmlPopupWindowOptions – Varias opciones como Posicion, Tamaño, menubar, etc
private void Button_Click(object sender, RoutedEventArgs e) {
HtmlPopupWindowOptions options = new HtmlPopupWindowOptions();
options.Left = 0;
options.Top = 0;
options.Width = 800;
options.Height = 600;
if (true == HtmlPage.IsPopupWindowAllowed)
HtmlPage.PopupWindow(new Uri("http://www.silverlight.net"), "new", options);
}
*Note: Safari no lo sporta por que no implementa correctamente el contrato NPAPI .
41.
Mientras la URI sea la misma, el sistema usará la imagen de la caché
Se pude soslayar este problema asignando la propiedad IgnoreImageCache a true.
Ejemplo:
Image img = new Image();
Uri uri = new Uri("http://YourServer.com/MyImage.png", UriKind.Absolute);
BitmapImage bi = new System.Windows.Media.Imaging.BitmapImage(uri);
bi.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
img.Source = bi;
LayoutRoot.Children.Add(img);
45.
Como todos los modelos de Enterprise Services propuestos por “Patterns & Practices” no resulta trivial al inicio
Requiere una curva de aprendizaje, pero minimiza los errores y facilita la depuración y el mantenimiento de la aplicación
Implementa (o permite hacerlo), técnicas de IoC y Depedency Injection (D.I.)
Algunas características recuerdan el modelo de “Programación orientada a aspectos” (AOP), sobre todo en el tema de D.I.
Disponible en www.codeplex.com
46. Empaquetado & Arquitectura Componente del navegador
Descarga pequeña.
Incluye video & audio
Se instala a peticion.
47. Silverlight .NET Framework
48. Plataformas y fechas de disponibilidad Calendario de versiones (Roadmap)
Silverlight 1 - September 2007
Silverlight 2 – Noviembre 2008
Moonlight (Linux/Unix) – Enero 2009
Silverlight Mobile – Mediados de 2009
Silverlight 3 – Finales de 2009
51. Usage Restrictions: PR Ready
San Diego Zoo Usage Restrictions: PR Ready
San Diego Zoo
52. Second largest travel company in Europe
Fast Facts
This leading international leisure travel group needed to create a community oriented travel experience
VINGtm
Results
Travelers discuss travel plans with other passengers, and visualize vacation destinations on a world map.
VINGtm is powered by Windows Live Messenger control, Spaces Photo, Microsoft Virtual Earth and Silverlight by Windows Live
“The key benefit of using Live Services is a great reduction in development time, we can program with a modular approach, saving time and resources”. Johan Hägglund, Team Manager for web development
Second largest travel company in Europe
Fast Facts
This leading international leisure travel group needed to create a community oriented travel experience
VINGtm
Results
Travelers discuss travel plans with other passengers, and visualize vacation destinations on a world map.
VINGtm is powered by Windows Live Messenger control, Spaces Photo, Microsoft Virtual Earth and Silverlight by Windows Live
“The key benefit of using Live Services is a great reduction in development time, we can program with a modular approach, saving time and resources”. Johan Hägglund, Team Manager for web development
53. Usage Restrictions: PR Ready
Usage Restrictions: PR Ready
56. Recursos en la Web Generales
Principal: http://silverlight.net/GetStarted/
Primer vistazo: http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx
Tutoriales: http://silverlight.net/learn/tutorials.aspx
MSDN: http://msdn.microsoft.com/en-us/library/bb404700(VS.95).aspx
Arquitectura: http://msdn.microsoft.com/en-us/library/bb404700(VS.95).aspx
Blogs sobre Silverlight (en inglés)
Alvin Ashcraft: http://www.alvinashcraft.com/
Bill Reiss: http://www.bluerosegames.com/SilverlightBrassTacks/
Brad Adams: http://blogs.gotdotnet.com/BradA/
Dan Wahlin: http://weblogs.asp.net/dwahlin/default.aspx
Dave Relyea - http://blogs.msdn.com/DevDave
Delay: http://blogs.msdn.com/delay/
Einar Ingebrigtsen: http://www.ingebrigtsen.info
Jeff Paries: http://designwithsilverlight.com/
Jessie Liberty: http://silverlight.net/blogs/jesseliberty/
Joe Stegman: http://blogs.msdn.com/jstegman/default.aspx
57. Recursos en la Web
Blogs sobre Silverlight (en inglés. Continuación)
Karen Corby: http://scorbs.com/
Laurence Moroney: http://blogs.msdn.com/webnext/default.aspx
Michael Palermo: http://weblogs.asp.net/palermo4/default.aspx
Michael Sync: http://michaelsync.net/
Neo: http://www.silverlightexamples.net/
Nikhil Kothari: http://www.nikhilk.net
Nikola: http://blogs.msdn.com/nikola/default.aspx and http://www.nokola.com/
Peter Blois: http://www.blois.us/blog/
Pete Brown: http://community.irritatedvowel.com/blogs/pete_browns_blog/default.aspx
Seema Ramchandani: http://blogs.msdn.com/seema
Scott Guthrie: http://weblogs.asp.net/scottgu/archive/tags/Silverlight/default.aspx
Synergist: http://blogs.msdn.com/synergist/
SDK Team: http://blogs.msdn.com/silverlight_sdk/
The MossyBlog Times: http://blogs.msdn.com/msmossyblog/
Tim Sneath: http://blogs.msdn.com/tims/
Tim Heuer: http://timheuer.com/blog/
VectorForm: http://www.vectorform.com/silverlight/blog/
Web Services Team: http://blogs.msdn.com/silverlightws
Wilco Bauwer: http://www.wilcob.com/Wilco/Silverlight.aspx
58. Recursos en la Web Otros sitios Silverlight (Enlaces diarios Silverlight, etc.)
http://www.silverlightshow.net/
http://www.silverlightcream.com/
http://mgalinks.wordpress.com/
http://www.shinedraw.com/
http://flexria.wordpress.com/category/silverlight/
Otros aspectos de interés para Silverlight
Motores 3D:
Kit3d: http://www.codeplex.com/Kit3D
Balder 3D Engine: http://www.codeplex.com/Balder
(Blog: http://www.dolittle.com/blogs/einar)
59. Recursos en la Web Programación de juegos:
Silverlight Games 101 by Bill Reiss
Refactor by Joel Neubeck.
Silverlight Game Programming Tutorial by Matthew Casperson
2D Game Development by Mike Gold.
Andy Beaulieu
Silverlight Games by Roger Guess
Developer Fusion
Envío de contraseñas seguras http://dnnsilverlight.adefwebserver.com/Samples/SilverlightXAML/tabid/56/Default.aspx
Silverlight Nuggets: http://silverlightnuggets.com/ Sockets: http://www.flawlesscode.com/ Web Services: http://dnnsilverlight.adefwebserver.com/Silverlight20/SilverlightWebservice/tabid/66/Default.aspx
60. Recursos en la Web Tutoriales sobre Silverlight (en orden alfabético):
Andy Beauliue http://www.andybeaulieu.com/Home/tabid/67/Default.aspx
Brad Adams http://blogs.msdn.com/brada/default.aspx
Chris Hay http://www.screencast.com/users/chrishayuk
DotNet Curry http://www.dotnetcurry.com/
Jesse Liberty http://silverlight.net/blogs/jesseliberty/
Joe Stegman http://blogs.msdn.com/jstegman/default.aspx
Nikola Mihaylov http://blogs.msdn.com/nikola/default.aspx
Page Brooks http://pagebrooks.com/
Pete Brown http://community.irritatedvowel.com/blogs/pete_browns_blog/default.aspx
Shawn Wildermuth http://wildermuth.com/
Silverlight Learning Resources http://silverlight.net/learn/
SilverlightShow http://www.silverlightshow.net/
Terence Tsang http://www.shinedraw.com/
Tim Heuer http://timheuer.com/blog/
Timmy Kokke http://geekswithblogs.net/tkokke/Default.aspx
Y una página sumario sobre blogs en Silverlight : http://www.netvibes.com/rboarman#Silverlight
61. Recursos http://msdn.microsoft.com
http://www.silverlight.net
http://www.elavefenix.net
Demo “on-line” de tipo general: http://www.elavefenix.net/AESS/aessTestPage.html
“Programación en Silverlight 2.0”: primera obra sobre el tema publicada en castellano.