<feed version="0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://purl.org/atom/ns#" xml:lang="es-MX"><title>{ WillyXoft .NET }</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/default.aspx" /><tagline type="text/html">Blog de Willy Mejía sobre Microsoft .NET Framework y temas relacionados...</tagline><id>http://dotnetjunkies.com/WebLog/vbpuntonet/default.aspx</id><author><url>http://dotnetjunkies.com/WebLog/vbpuntonet/default.aspx</url></author><generator url="http://communityserver.org" version="1.0.1.50214">Community Server</generator><modified>2008-06-07T17:35:00Z</modified><entry><title>Cambiar el monto de la pila</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/08/14/502060.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:502060</id><created>2008-08-14T22:07:07Z</created><content type="text/html" mode="escaped">&lt;p&gt;Si bien lo mejor es conformarnos con el tamaño de pila (stack) predeterminado para una ejecución confiable, hay algunos casos en los que puede resultar necesario que se cambie el tamaño de la pila, ya que si se intenta utilizar más memoria de la que está disponible en la pila se lanzaría una &lt;a href="http://msdn.microsoft.com/library/system.stackoverflowexception.aspx"&gt;StackOverflowException&lt;/a&gt; que no se puede manejar. Tales casos incluyen, aunque no son lo únicos: la implementación de algún algoritmo recursivo de gran profundidad, una mejor utilización de la asignación de pila (stackalloc), así como la optimización en el uso de hilos múltiples. Mas tenga en cuenta que debe mantener dicho valor lo más pequeño que se pueda.
&lt;p&gt;&lt;strong&gt;EDITBIN&lt;/strong&gt; 
&lt;p&gt;Para modificar el tamaño de la pila en C++ se utiliza la opción "/stack" del vinculador (linker). Pero para los binarios creados con compiladores de lenguajes .NET, como C#, se tiene que recurrir a la herramienta EDITBIN.EXE. 
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/library/xd3shwhf.aspx"&gt;EDITBIN&lt;/a&gt; es una herramienta de línea de comandos que viene con Visual Studio, la cual se utiliza para modificar binarios en formato COFF (Common Object File Format). Para el caso que nos interesa utilizaremos la opción /STACK, de forma similar al vinculador de C++: 
&lt;p&gt;EDITBIN.EXE /STACK:reserve[,commit]  
&lt;p&gt;La opción /STACK sólo se aplica a un archivo ejecutable (EXE). El tamaño de la pila se establece en bytes. 
&lt;p&gt;El argumento reserve especifica la asignación total de memoria virtual de la pila. El valor especificado se redondeará a los 4 bytes más próximos. 
&lt;p&gt;El argumento opcional commit está sujeto a interpretación por el sistema operativo. En Windows NT, Windows 95 y Windows 98, commit especifica la cantidad de memoria física que se debe asignar de una sola vez. La memoria virtual comprometida hace que se reserve espacio en el archivo de paginación. Si se asigna un valor más alto a commit, se ahorrará tiempo cuando la aplicación necesite más espacio de la pila, pero aumentarán los requisitos de memoria y, posiblemente, el tiempo de inicio. 
&lt;p&gt;Así por ejemplo, para reservar un tamaño máximo de pila de 2MB ejecutaríamos:&lt;/p&gt;
&lt;p&gt;EDITBIN.EXE /STACK:2097152 ejecutable.exe 
&lt;p&gt;Este método nos obliga a alterar el ejecutable después de cada compilación, cosa que se pude automatizar utilizando el evento &lt;em&gt;post-build&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;Tome en cuenta que se trata de una asignación estática que afecta al ejecutable en sí, cuando talvez sería más conveniente una solución dinámica, en tiempo de ejecución y que afecte a un solo hilo a la vez.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CreateThread&lt;/strong&gt; 
&lt;p&gt;Se puede especificar programáticamente el tamaño de un hilo utilizando la API de Windows. Para ello empleamos &lt;a href="http://msdn.microsoft.com/magazine/cc164123.aspx"&gt;PInvoke&lt;/a&gt; con kernel32.dll y ejecutando su método &lt;a href="http://msdn.microsoft.com/en-us/library/ms682453.aspx"&gt;CreateThread&lt;/a&gt; para crear dicho hilo con el tamaño especificado en su segundo parámetro. 
&lt;p&gt;&lt;font face="Lucida Console" size="2"&gt;myThread = CreateThread( &lt;br&gt;    IntPtr.Zero, // atributo de seguridad&lt;br&gt;    maxStackSize, // tamaño máximo de pila&lt;br&gt;    myThreadDelegate, // delegado del hilo&lt;br&gt;    pDataArg, // argumento para el delegado&lt;br&gt;    0, // bandera predeterminada&lt;br&gt;    out dwThreadId); // identificador del hilo &lt;/font&gt;
&lt;p&gt;Dado que se trata del uso del API Win32, este método puede utilizarse con cualquier versión del .NET Framework y funciona con cualquier sistema Windows compatible. Por otro lado, tenga en cuenta que se trata de "código inseguro" (unsafe-code). 
&lt;p&gt;Más información en &lt;a href="http://msdn.microsoft.com/library/ms682516.aspx"&gt;Creating Threads&lt;/a&gt;. 
&lt;p&gt;&lt;strong&gt;Constructor Thread&lt;/strong&gt; 
&lt;p&gt;Un par de sobrecargas del &lt;a href="http://msdn.microsoft.com/library/system.threading.thread.thread.aspx"&gt;constructor de la clase Thread&lt;/a&gt;, disponibles a partir de la versión 2.0 del .NET Framework, nos permiten especificar el tamaño máximo de pila para el mismo. 
&lt;p&gt;&lt;font face="Lucida Console" size="2"&gt;Thread myThread = new Thread(myThreadDelegate, maxStackSize);&lt;/font&gt; 
&lt;p&gt;Donde:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MyThreadDelegate: es un delegado &lt;a href="http://msdn.microsoft.com/library/system.threading.threadstart.aspx"&gt;ThreadStart&lt;/a&gt; o &lt;a href="http://msdn.microsoft.com/library/system.threading.parameterizedthreadstart.aspx"&gt;ParameterizedThreadStart&lt;/a&gt; que representa los métodos a ser invocados cuando el hilo empieza a ejecutarse. 
&lt;li&gt;maxStackSize: es el tamaño de pila máximo a ser utilizado por el hilo, si es 0 utiliza el tamaño predeterminado especificado en el encabezado del ejecutable. Si no es ningún múltiplo del tamaño de página establecido por el sistema operativo, se redondea al múltiplo mayor siguiente del tamaño de página.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Este método sólo funciona con sistemas operativos Windows XP, Windows 2003 y posteriores, en sistemas anteriores no tendrá ningún efecto por lo que se utiliza el tamaño de la pila especificado en la cabecera del ejecutable. 
&lt;p&gt;NOTA:&lt;/p&gt;
&lt;p&gt;Si maxStackSize es menor que el tamaño de pila mínimo, se utiliza el tamaño de pila mínimo. Si especifica un tamaño de pila muy pequeño y la pila está muy limitada, podría necesitar deshabilitar el sondeo de desbordamiento de pila, ya que el propio sondeo puede provocar un desbordamiento de pila. Para deshabilitar el sondeo del desbordamiento de pila, agregue lo siguiente al archivo de configuración de la aplicación.&lt;/p&gt;
&lt;pre&gt;&lt;font size="2"&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;runtime&amp;gt;
    &amp;lt;disableStackOverflowProbing enabled="true"/&amp;gt;
  &amp;lt;/runtime&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=502060" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=502060</wfw:commentRss></entry><entry><title>Service Pack 1 para VS 2008 y NetFx 3.5</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/08/11/500134.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:500134</id><created>2008-08-11T18:33:00Z</created><content type="text/html" mode="escaped">&lt;p&gt;"Basados en las mejores características de VS2008 y .NET 3.5, estoy satisfecho de anunciar hoy el lanzamiento del &lt;a href="http://go.microsoft.com/?linkid=9330986"&gt;Service Pack 1 de .NET Framework 3.5 y Visual Studio 2008&lt;/a&gt; (inglés).&lt;/p&gt;
&lt;p&gt;En Visual Studio 2008 SP1 nos hemos concentrado en &lt;strong&gt;mejorar el rendimiento y la fiabilidad&lt;/strong&gt;. Hemos trabajado en nuestros diseñadores para la creación de aplicaciones de &lt;strong&gt;WPF&lt;/strong&gt; mejorando su rendimiento, se han mejorado las herramientas para desarrollar aplicaciones &lt;strong&gt;AJAX&lt;/strong&gt;, diseñadores mejorados para trabajar con el &lt;strong&gt;ADO.NET Entity Framework&lt;/strong&gt; y hemos incluido un entorno de desarrollo &lt;strong&gt;JavaScript&lt;/strong&gt; más completo a la vez que hemos simplificado la experiencia de implementación de sitios Web. 
&lt;p&gt;En .NET Framework hemos ido un poco más allá. Aparte de corregir los problemas notificados por clientes también hemos añadido algunas características muy solicitadas para facilitar el desarrollo de aplicaciones para las plataformas más recientes. Algunas de estas nuevas características incluyen &lt;strong&gt;.NET Framework Client Profile&lt;/strong&gt;, compatibilidad mejorada para desarrollo de aplicaciones de base de datos a través del &lt;strong&gt;ADO.NET Entity Framework&lt;/strong&gt;, &lt;strong&gt;ADO.NET Data Services&lt;/strong&gt; y su integración con el recientemente lanzado SQL Server 2008, además de &lt;strong&gt;varias mejoras en ASP.NET."&lt;/strong&gt; 
&lt;p&gt;Historia completa en: &lt;a href="http://blogs.msdn.com/somasegar/archive/2008/08/11/service-pack-1-for-vs-2008-and-net-fx-3-5-released.aspx"&gt;Service Pack 1 for VS 2008 and .NET FX 3.5 released!&lt;/a&gt; o bien la traducción: &lt;a href="http://blogs.msdn.com/somaespanol/archive/2008/08/11/publicado-el-service-pack-1-de-visual-studio-2008-y-net-fx-3-5.aspx"&gt;Publicado el Service Pack 1 de Visual Studio 2008 y .NET FX 3.5&lt;/a&gt;. 
&lt;p&gt;Por su parte &lt;strong&gt;Sam Gentile&lt;/strong&gt; nos cuenta lo que el SP1 trae consigo para &lt;strong&gt;WCF&lt;/strong&gt; en: &lt;a href="http://samgentile.com/blogs/samgentile/archive/2008/08/11/new-and-notable-264-visual-studio-2008-sp1-and-net-framework-3-5-sp1-rtm.aspx"&gt;New and Notable 264 - Visual Studio 2008 SP1 and .NET Framework 3.5 SP1 RTM!&lt;/a&gt;, a la vez que nos deja una interesante lista de vínculos: 
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=123679"&gt;Visual Studio 2008 Express Editions with Service Pack 1 (Bootstrappers)&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=123680"&gt;Visual Studio 2008 Express Editions with Service Pack 1 (iso)&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=122094"&gt;Visual Studio 2008 Service Pack 1 (Bootstrapper)&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=122095"&gt;Visual Studio 2008 Service Pack 1 (iso)&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=124829"&gt;Visual Studio&amp;nbsp; Team System 2008 Team Foundation Server Service Pack 1&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=124150"&gt;.NET Framework 3.5 Service Pack 1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=500134" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=500134</wfw:commentRss></entry><entry><title>SQL Server 2008 RTM</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/08/06/497473.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:497473</id><created>2008-08-07T03:38:13Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;a href="http://www.microsoft.com/global/sqlserver/2008/en/us/PublishingImages/diag-sql2008-lg.gif"&gt;&lt;img title="SQL Server Model" height="212" alt="SQL Server Model" src="http://i.microsoft.com/global/sqlserver/2008/en/us/PublishingImages/diag-sql2008-sm.gif" width="216" align="right" border="0"&gt;&lt;/a&gt; Microsoft ha anunciado la liberación del RTM de SQL Server 2008, la nueva versión del gestor de datos y plataforma de inteligencia de negocios de Microsoft.&lt;/p&gt;
&lt;p&gt;Esta versión de SQL Server proporciona nuevas capacidades tales como el soporte para la gestión basada en políticas, auditoria, &lt;em&gt;warehousing&lt;/em&gt; de datos a gran escala, datos geo-espaciales, y servicios de reporte y análisis avanzados.&lt;/p&gt;
&lt;p&gt;SQL Server 2008 proporciona la plataforma confiable, productiva e inteligente necesaria para las aplicaciones de negocio críticas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Confiable&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/security.aspx"&gt;Protege la información valiosa&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/high-availability.aspx"&gt;Garantiza la continuidad del negocio&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/performance-scale.aspx"&gt;Habilita la respuesta previsible&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;p&gt;&lt;strong&gt;Productivo&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/manageability.aspx"&gt;Eleva la productividad del administrador&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/programmability.aspx"&gt;Simplifica el desarrollo&lt;/a&gt; con ayuda de &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/ado-net-data.aspx"&gt;ADO.NET Object Services&lt;/a&gt; y &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/linq.aspx"&gt;LINQ&lt;/a&gt;
&lt;li&gt;Almacena cualquier tipo de información, incluyendo &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx"&gt;datos espaciales&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;p&gt;&lt;strong&gt;Inteligente&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Integra datos con &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/integration.aspx"&gt;Integration Services&lt;/a&gt; para &lt;em&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/data-warehousing.aspx"&gt;Data Warehousing&lt;/a&gt;&lt;/em&gt; 
&lt;li&gt;Brinda información relevante con &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/analysis-services.aspx"&gt;Analysis Services&lt;/a&gt; 
&lt;li&gt;Entrega ideas con &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/reporting.aspx"&gt;Reporting Services&lt;/a&gt; para &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/data-mining.aspx"&gt;&lt;em&gt;Data Mining&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;p&gt;SQL Server 2008 está disponible para subscriptores MSDN y Technet, y muy pronto estará disponible la versión de evaluación. Las ediciones Express y Compact de SQL Server 2008 estarán disponibles en la página de &lt;a href="http://www.microsoft.com/sqlserver"&gt;SQL Server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Más información en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/presspass/press/2008/aug08/08-06SQLServer2008PR.mspx"&gt;Microsoft Releases SQL Server 2008&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/overview.aspx"&gt;SQL Server 2008 Product Overview&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/presspass/presskits/sqlserver/docs/SQLSERVER2008FAQ.doc"&gt;Microsoft SQL Server 2008 FAQ&lt;/a&gt; (.doc, 51 KB)&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;ACTUALIZACIÓN&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Ya están disponibles las descargas de:&lt;/p&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=58ce885d-508b-45c8-9fd3-118edd8e6fff"&gt;Microsoft SQL Server 2008 Express&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6b10c7c1-4f97-42c4-9362-58d4d088cd38&amp;amp;DisplayLang=es"&gt;Microsoft SQL Server 2008 Enterprise Evaluation: para desarrolladores&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=265f08bc-1874-4c81-83d8-0d48dbce6297&amp;amp;DisplayLang=es"&gt;Microsoft SQL Server 2008 Enterprise Evaluation: para profesionales de TI&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=765433f7-0983-4d7a-b628-0a98145bcb97&amp;amp;DisplayLang=es"&gt;Libros en pantalla de Microsoft SQL Server 2008&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c6c3e9ef-ba29-4a43-8d69-a2bed18fe73c&amp;amp;DisplayLang=es"&gt;Feature Pack de Microsoft SQL Server 2008 (agosto de 2008)&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=f5a6c5e9-4cd9-4e42-a21c-7291e7f0f852&amp;amp;DisplayLang=es"&gt;Asesor de actualizaciones de Microsoft SQL Server 2008&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img height="75" src="http://i.microsoft.com/global/sqlserver/2008/en/us/PublishingImages/logo-header-sql08-dg.gif" width="363"&gt;&lt;/p&gt;&lt;/li&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=497473" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=497473</wfw:commentRss></entry><entry><title>Seguridad para Servicios Web WCF</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/08/04/497779.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:497779</id><created>2008-08-07T11:52:11Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;img height="240" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=WCFSecurityGuide&amp;DownloadId=40355" width="182" align="right"&gt;El equipo de patterns &amp; practices ha publicado la versión 1.0 (final) de su guía de seguridad para Servicios Web, titulada:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Improving Web Services Security: &lt;br&gt;&lt;/strong&gt;&lt;em&gt;Scenarios and Implementation Guidance for WCF&lt;/em&gt;&lt;/p&gt; &lt;p&gt;En la cual se muestra cómo mejorar la seguridad de WCF mediante escenarios, guías directivas, Preguntas &amp; Respuestas, listados Como-Se-Hace, etc... &lt;/p&gt; &lt;p&gt;La guía está relacionada con el proyecto de seguridad &lt;a href="http://www.codeplex.com/WCFSecurity"&gt;WCF Security Guidance Project&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Mayor información y descarga de la guía en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeplex.com/WCFSecurityGuide"&gt;Improving Web Services Security&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=497779" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=497779</wfw:commentRss></entry><entry><title>Midori: SO Administrado</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/08/04/496492.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:496492</id><created>2008-08-04T21:48:31Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;img src="http://news.cnet.com/i/bto/20080305/singularity_270x178.jpg" align="right"&gt; Midori es el nombre clave de un posible sistema operativo comercial sucesor del actual proyecto Singularity, el cual es un proyecto de investigación iniciado en 2003 sobre un sistema operativo en código administrado .NET, y cuyo RDK (Research Development Kit) Microsoft Research hizo público el pasado mes de marzo. &lt;p&gt;Midori sería entonces un Sistema Operativo en Modo Administrado, en el cual el núcleo (kernel), controladores de dispositivos (drivers), y aplicaciones están todos escritos en código administrado .NET, por ende sería un SO construido desde cero y no una simple evolución de la tecnología Windows actual. Para resolver el problema de la compatibilidad hacia atrás Midori emplearía tecnología de virtualización.  &lt;p&gt;Cuando Windows fue diseñado no había Internet como hoy lo conocemos, por lo que las funcionalidades al respecto se le añadieron más tarde con parches. El diseño inicial de Midori sin embargo estará centrado en Internet y la reducción del acoplamiento existente entre los datos, las aplicaciones y los dispositivos, llevando a cumplimiento el sueño de Bill Gates iniciado con .NET.  &lt;p&gt;No obstante aún no existen plazos para el desarrollo de Midori, el cual es considerado como un "proyecto de investigación". Un portavoz de Microsoft incluso afirmó que Midori es apenas uno de muchos proyectos en incubación en Microsoft Research.&lt;/p&gt; &lt;p&gt;Por lo que de momento lo único "concreto" que existe es el proyecto Singularity.&lt;/p&gt; &lt;p&gt;Mas información en:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.sdtimes.com/MICROSOFT_S_PLANS_FOR_POST_WINDOWS_OS_REVEALED/About_CLOUDCOMPUTING_and_MOBILEDEVELOPMENT_and_NET_and_SOASAAS_and_SOFTWAREDEVELOPMENT_and_WINDOWS_and_MICROSOFT/32627"&gt;Microsoft's plans for post-Windows OS revealed&lt;/a&gt;  &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.sdtimes.com/MICROSOFT_MAPS_OUT_MIGRATION_FROM_WINDOWS/About_VIRTUALIZATION_and_WINDOWS_and_MICROSOFT/32646"&gt;Microsoft maps out migration from Windows&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a href="http://www.infoworld.com/article/08/07/29/Microsoft_prepares_for_end_of_Windows_with_Midori_1.html"&gt;Microsoft prepares for end of Windows with Midori&lt;/a&gt;  &lt;li&gt;&lt;a href="http://research.microsoft.com/os/Singularity/"&gt;Singularity Project&lt;/a&gt; &lt;li&gt;&lt;a title="http://www.codeplex.com/singularity" href="http://www.codeplex.com/singularity"&gt;Singularity RDK&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=496492" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=496492</wfw:commentRss></entry><entry><title>Web Service Software Factory Contrib</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/26/492248.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:492248</id><created>2008-07-27T05:42:38Z</created><content type="text/html" mode="escaped">&lt;p&gt;Un nuevo proyecto de "contribuciones" para extender el Web Service Software Factory ha sido abierto, e inicia con un par de las contribuciones más buscadas: &lt;ul&gt; &lt;li&gt;&lt;em&gt;VB.NET Release&lt;/em&gt;, donde Edward Bakker extiende el release oficial de Febrero de 2008 para incluir plantillas de generación de código VB.NET y tipos de proyecto&lt;/li&gt; &lt;li&gt;&lt;em&gt;Import WSDL Add-on&lt;/em&gt;, facilitado por Digit Factory para la generación de modelos desde documentos WSDL existentes (Hurra!)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Mayor información en el sitio del proyecto: &lt;a href="http://www.codeplex.com/wssfcontrib"&gt;Web Service Software Factory Contrib&lt;/a&gt;&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=492248" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=492248</wfw:commentRss></entry><entry><title>Aplicaciones Compuestas con WPF</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/14/486855.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:486855</id><created>2008-07-14T20:00:12Z</created><content type="text/html" mode="escaped">&lt;p&gt;El equipo de patterns &amp; practices de Microsoft ha publicado el conjunto de guías titulado: &lt;em&gt;Composite Application Guidance for WPF&lt;/em&gt;. El cual contiene una implementación de referencia que emplea patrones de diseño, conceptos y técnicas para la construcción de aplicaciones compuestas con WCF. Incluye además ejemplos de inicio rápido, laboratorios, temas "como se hace", etc.&lt;/p&gt; &lt;p&gt;&lt;img src="http://blogs.msdn.com/blogfiles/gblock/WindowsLiveWriter/CompositeApplicationGuidanceisLive_1479E/image_thumb[7]_2.png"&gt;&lt;/p&gt; &lt;p&gt;La implementación de referencia ilustra cómo se pueden enfrentar muchos de los retos presentes en la construcción de aplicaciones basada en módulos independientes pero colaborativos.&lt;/p&gt; &lt;p&gt;&lt;img src="http://i.msdn.microsoft.com/Cc707901.a6c1ccb5-ccf6-4bef-800a-0b502fb9b155.png"&gt;&lt;/p&gt; &lt;p&gt;Mas información en:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/07/03/composite-application-guidance-is-live.aspx"&gt;Composite Application Guidance is Live&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc707819.aspx"&gt;Composite Application Guidance for WPF - June 2008&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=486855" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=486855</wfw:commentRss></entry><entry><title>WCF bajo Contrato (4/4)</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/05/484215.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:484215</id><created>2008-07-05T14:02:55Z</created><content type="text/html" mode="escaped">&lt;h3&gt;&lt;a name="contrato-fallo"&gt;Contrato de Fallo&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Cualquier operación petición/respuesta devuelve dos posibles mensajes: su mensaje de respuesta normal, o bien un mensaje de error. Para enviar un mensaje de error (un "SOAP Fault" en términos de servicios web) se lanza una &lt;strong&gt;FaultException&lt;/strong&gt; en la implementación del servicio, tal y como se ha ejemplificado hasta ahora.&lt;/p&gt; &lt;p&gt;Pero además se pueden especificar formalmente los mensajes de error utilizando tipos personalizados con un contrato de datos adecuado, dado que se serializarán mediante el DataContractSerializer. El tipo a utilizar en el mensaje de error se especifica contractualmente en la firma de la operación utilizando el atributo &lt;b&gt;FaultContract&lt;/b&gt;, mientras que en la implementación de la operación se genera mediante una FaultException del tipo especificado en el FaultContract.&lt;/p&gt; &lt;p&gt;Como ejemplo suponga que deseamos especificar un mensaje de error, que nos informe sobre un error en el parámetro de la petición, utilizando el siguiente tipo con su contrato de datos:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de HelloData.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&lt;b&gt;[DataContract(Namespace="http://hello/data/")]&lt;/b&gt;
public class &lt;b&gt;InvalidRequest&lt;/b&gt;
{
  private int id;
  private string message;
  private string notes;

  &lt;b&gt;[DataMember()]&lt;/b&gt;
  public int ID
  {
    get { return id; }
    set { id = value; }
  }

  &lt;b&gt;[DataMember()]&lt;/b&gt;
  public string Message
  {
    get { return message; }
    set { message = value; }
  }				

  &lt;b&gt;[DataMember()]&lt;/b&gt;
  public string Notes
  {
    get { return notes; }
    set { notes = value; }
  }				
}&lt;/pre&gt;
&lt;p&gt;El fragmento de código se agrega al archivo HelloData.cs, tras lo cual lo compilamos.&lt;/p&gt;
&lt;p&gt;Para especificar el uso del tipo InvalidRequest como &lt;em&gt;tipo de fallo&lt;/em&gt; sobre la operación, aplicamos el atributo FaultContract a la firma de la operación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;[ServiceContract(Namespace="http://hello/", Name="Hello")]
interface IHello
{
  [OperationContract()]
  &lt;b&gt;[FaultContract(typeof(InvalidRequest))]
  &lt;/b&gt;SayHelloResponse SayHello(SayHelloRequest request);
}&lt;/pre&gt;
&lt;p&gt;Después en la clase de implementación del servicio se lanzan las excepciones correspondientes:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")]
  public class Hello : IHello
  {
    private StringBuilder message = new StringBuilder("¡Hola ");

    &lt;b&gt;private void ValidateRequest(SayHelloRequest request)&lt;/b&gt;
    {
      if (request.PersonParameter == null)
      {
        InvalidRequest fault = new InvalidRequest();
        fault.ID = 1;
        fault.Message = "Parámetro Person inválido";
        fault.Notes = "El objeto Person no puede ser nulo...";
        &lt;b&gt;throw new FaultException&amp;lt;InvalidRequest&amp;gt;(fault, "Parámetro inválido.");&lt;/b&gt;
      }
      else if (request.PersonParameter.FirstName == null ||
        request.PersonParameter.FirstName.Length == 0)
      {
        InvalidRequest fault = new InvalidRequest();
        fault.ID = 2;
        fault.Message = "Miembro FirstName inválido";
        fault.Notes = "El miembro FirstName del objeto Person no puede ser nulo o vacío...";
        &lt;b&gt;throw new FaultException&amp;lt;InvalidRequest&amp;gt;(fault, "Parámetro inválido.");&lt;/b&gt;
      }
    }

    public SayHelloResponse SayHello(SayHelloRequest request)
    {
      &lt;b&gt;ValidateRequest(request);&lt;/b&gt;

      message.Append(request.PersonParameter.FirstName + "!");
      string msg = message.ToString();
      SayHelloResponse response = new SayHelloResponse();
      HelloCard card = new HelloCard();
      card.Greeting = msg;
      response.HelloCardResult = card;
      System.Console.WriteLine(msg);
      return response;
    }
  }&lt;/pre&gt;
&lt;p&gt;Nótese que hemos extraído el código de validación del request en un método privado, en el cual se crea una instancia de InvalidRequest, se establece la información pertinente, y se lanza un FaultException con dicha instancia. Note además que se hace el uso de la versión "genérica" de FaultException para ello.&lt;/p&gt;
&lt;p&gt;Compilamos Hello.cs, y para terminar del lado del servicio sólo ejecutamos la aplicación host.&lt;/p&gt;
&lt;p&gt;Para el cliente una vez más se regeneran los artefactos cliente con svcutil.exe. &lt;/p&gt;
&lt;p&gt;Después, aunque el código de la aplicación cliente podría funcionar sin cambios, para poder consumir los mensajes adicionales de error (de tipo InvalidRequest) ahora agregaremos un &lt;i&gt;catch&lt;/i&gt; para "atrapar" el FaultException de tipo InvalidRequest. El listado de Client.cs queda de la siguiente manera:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.ServiceModel;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      hello.Hello service = new hello.HelloClient();
      hello.data.Person person = new hello.data.Person();
      person.FirstName = arg;
      hello.SayHelloRequest request = new hello.SayHelloRequest();
      request.Person = person;
      hello.SayHelloResponse response = service.SayHello(request);
      result = response.HelloCard.Greeting;
    }
    &lt;b&gt;catch (FaultException&amp;lt;hello.data.InvalidRequest&amp;gt; helloFault)&lt;/b&gt;
    {
      &lt;b&gt;result = String.Format("{0}\nID: {1}\nMensaje: {2}\nNotas: {3}",&lt;/b&gt;
                &lt;b&gt;helloFault.Message,&lt;/b&gt;
                &lt;b&gt;helloFault.Detail.ID,&lt;/b&gt;
                &lt;b&gt;helloFault.Detail.Message,&lt;/b&gt;
                &lt;b&gt;helloFault.Detail.Notes);&lt;/b&gt;
    }
    catch (FaultException fault) {
      result = "Fault: " + fault.Message;
    }
    catch (Exception ex) {
      result = "Error: " + ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Observe que para acceder a los miembros de la instancia de InvalidRequest enviada utilizamos la propiedad &lt;strong&gt;Detail&lt;/strong&gt; de la instancia de FaultException &lt;em&gt;helloFault&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Compilamos el proxy y el cliente, y ejecutamos Client.exe. Pruebe las excepciones modificando el código de la aplicación cliente, ya sea estableciendo a nulo el valor del miembro FirstName o el parámetro Person, y volviendo a compilar y ejecutar...&lt;/p&gt;
&lt;h3&gt;Epílogo&lt;/h3&gt;
&lt;p&gt;Con los ejemplos vistos en la presente serie se han explorado brevemente los diferentes tipos de contratos de WCF: contrato de servicio, contrato de datos, contrato de mensajes y contrato de fallo. Los mismos se definen aplicando ciertos atributos a clases y sus miembros. Los atributos permiten parámetros por nombre, tales como el Namespace y Name,&amp;nbsp; para una mejor definición del elemento al cual se aplica. Queda como tarea para el lector que indague sobre dichos parámetros, ya que existen muchos otros en cada uno de los distintos atributos.&lt;/p&gt;
&lt;p&gt;Quedan pendientes entonces varias cosas, además del nuevo cliente Java, mismas que espero abordar en futuras ocasiones. ¡Hasta entonces!&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=484215" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=484215</wfw:commentRss></entry><entry><title>WCF bajo Contrato (3/4)</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/04/484035.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:484035</id><created>2008-07-04T17:17:15Z</created><content type="text/html" mode="escaped">&lt;h3&gt;&lt;a name="contrato-mensajes"&gt;Contrato de Mensajes&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Hasta ahora se ha redefinido el &lt;a href="http://willyxoft.wordpress.com/2008/07/02/contratos-wcf-p1/"&gt;contrato de servicio&lt;/a&gt; utilizando una interfaz, así como empleado tipos personalizados con &lt;a href="http://willyxoft.wordpress.com/2008/07/03/contratos-wcf-p2/"&gt;contrato de datos&lt;/a&gt; definidos, lo cual es suficiente en la mayoría de los casos. &lt;/p&gt; &lt;p&gt;Pero cuando se desea tener mayor control sobre la estructura de los mensajes SOAP debemos crear un &lt;strong&gt;contrato de mensajes&lt;/strong&gt; el cual permite utilizar un tipo para el parámetro y el valor devuelto que se serialicen en los mensajes SOAP de solicitud y respuesta que se necesiten.&lt;/p&gt; &lt;p&gt;A éste estilo de modelado de las operaciones se le conoce como &lt;b&gt;estilo de mensajería&lt;/b&gt;, en contraposición al &lt;i&gt;estilo de llamada de procedimiento remoto (RPC)&lt;/i&gt;. Las firmas de las operaciones de estilo de mensajería tienen hasta un parámetro y un valor de retorno y ambos deben ser &lt;i&gt;tipos de mensaje&lt;/i&gt; que se serializan directamente en una estructura del mensaje SOAP especificado.&lt;/p&gt; &lt;p&gt;Para definir el contrato de mensajes debemos aplicar el atributo &lt;b&gt;MessageContract&lt;/b&gt; a las clases que vayan ser los &lt;i&gt;tipos de mensaje&lt;/i&gt;. Así también debemos aplicar el atributo &lt;b&gt;MessageBodyMember&lt;/b&gt; a sus miembros (que pueden ser campos, propiedades o eventos) que serán los elementos del cuerpo del mensaje SOAP, o bien el atributo &lt;b&gt;MessageHeader&lt;/b&gt; para especificar el encabezado del mensaje.&lt;/p&gt; &lt;p&gt;Podriamos haber empleado el contrato de mensajes desde la versión del servicio que empleaba tipos simples, en cuyo caso podría ser algo como:&lt;/p&gt;&lt;pre&gt;&lt;b&gt;[MessageContract()]&lt;/b&gt;
public class SayHelloRequest
{
  &lt;b&gt;[MessageBodyMember()]&lt;/b&gt;
  public string name
}

&lt;b&gt;[MessageContract()]&lt;/b&gt;
public class SayHelloResponse
{
  &lt;b&gt;[MessageBodyMember()]&lt;/b&gt;
  public string greeting
}&lt;/pre&gt;
&lt;p&gt;Pero continuando con nuestro ejemplo, los contratos de mensaje para la operación SayHello quedan de la siguiente forma:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&lt;b&gt;using hello.data;&lt;/b&gt;

  &lt;b&gt;[MessageContract()]&lt;/b&gt;
  public class SayHelloRequest
  {
    private Person person;

    &lt;b&gt;[MessageBodyMember(Name="Person")]&lt;/b&gt;
    public Person PersonParameter
    {
      get { return person; }
      set { person = value; }
    }
  }

  &lt;b&gt;[MessageContract()]&lt;/b&gt;
  public class SayHelloResponse
  {
    private HelloCard helloCard;

    &lt;b&gt;[MessageBodyMember(Name="HelloCard")]&lt;/b&gt;
    public HelloCard HelloCardResult
    {
      get { return helloCard; }
      set { helloCard = value; }
    }
  }&lt;/pre&gt;
&lt;p&gt;Nótese que se trata de clases "planas" con atributos, y que los elementos del cuerpo de los mensajes son los tipos personalizados con contratos de datos definidos anteriormente en HelloData.cs.&lt;/p&gt;
&lt;p&gt;Para utilizar los tipos de mensaje ahora la firma del contrato de servicio debe redefinirse como sigue:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs (fragmento)&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;[ServiceContract(Namespace="http://hello/", Name="Hello")]
interface IHello
{
  [OperationContract()]
  &lt;b&gt;SayHelloResponse SayHello(SayHelloRequest request);&lt;/b&gt;
}&lt;/pre&gt;
&lt;p&gt;Por lo que también debemos reescribir su implementación. El listado completo de Hello.cs queda entonces de la siguiente forma:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
using System.ServiceModel;
using hello.data;

namespace hello
{

  [MessageContract()]
  public class &lt;strong&gt;SayHelloRequest&lt;/strong&gt;
  {
    private Person person;

    [MessageBodyMember(Name="Person")]
    public Person PersonParameter
    {
      get { return person; }
      set { person = value; }
    }
  }

  [MessageContract()]
  public class &lt;strong&gt;SayHelloResponse&lt;/strong&gt;
  {
    private HelloCard helloCard;

    [MessageBodyMember(Name="HelloCard")]
    public HelloCard HelloCardResult
    {
      get { return helloCard; }
      set { helloCard = value; }
    }
  }
  
  [ServiceContract(Namespace="http://hello/", Name="Hello")]
  interface IHello
  {
    [OperationContract()]
    &lt;strong&gt;SayHelloResponse SayHello(SayHelloRequest request);&lt;/strong&gt;
  }

  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")]
  public class Hello : IHello
  {
    private StringBuilder message = new StringBuilder("¡Hola ");

    &lt;strong&gt;public SayHelloResponse SayHello(SayHelloRequest request)&lt;/strong&gt;
    {
      if (request.PersonParameter == null ||
          request.PersonParameter.FirstName == null ||
          request.PersonParameter.FirstName.Length == 0)
        throw new FaultException(
            "Parámetro Person inválido.");

      &lt;strong&gt;message.Append(request.PersonParameter.FirstName + "!");&lt;/strong&gt;
      string msg = message.ToString();
      &lt;strong&gt;SayHelloResponse response = new SayHelloResponse();&lt;/strong&gt;
      HelloCard card = new HelloCard();
      card.Greeting = msg;
      &lt;strong&gt;response.HelloCardResult = card;&lt;/strong&gt;
      System.Console.WriteLine(msg);      
      &lt;strong&gt;return response;&lt;/strong&gt;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Las clases de los archivos HelloData.cs y HelloHost.cs permanecen sin cambios. Por lo que del lado del servicio únicamente compilamos el archivo Hello.cs:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll,HelloData.dll&lt;/pre&gt;
&lt;p&gt;...y ejecutamos la aplicación host.&lt;/p&gt;
&lt;p&gt;Continuemos con el cliente. Primero debemos (una vez más) regenerar los artefactos cliente con svcutil.exe, y después modificar el código de Client.cs como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      hello.Hello service = new hello.HelloClient();         
      hello.data.Person person = new hello.data.Person();
      person.FirstName = arg;
      &lt;strong&gt;hello.SayHelloRequest request = new hello.SayHelloRequest();&lt;/strong&gt;
      &lt;strong&gt;request.Person = person;&lt;/strong&gt;
      &lt;strong&gt;hello.SayHelloResponse response = service.SayHello(request);&lt;/strong&gt;
      &lt;strong&gt;result = response.HelloCard.Greeting;&lt;/strong&gt;
    }
    catch (System.ServiceModel.FaultException fault)
    {
      result = "Fault: " + fault.Message;
    }
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Nótese que antes del llamado al método SayHello se deben crear una instancia del tipo de mensaje SayHelloRequest, así como el tipo Person para su miembro correspondiente. La invocación retorna una instancia del tipo de mensaje SayHelloResponse mediante la cual se recupera el mensaje a desplegar. Note también que los elementos de los mensajes tienen los nombres especificados en el argumento por nombre "Name" del atributo MessageBodyMember correspondiente.&lt;/p&gt;
&lt;p&gt;Para finalizar compilamos el proxy y la aplicación cliente, y ejecutamos Client.exe como hasta ahora.&lt;/p&gt;
&lt;p&gt;Dado que en el presente ejemplo no hemos empleado el contrato de mensajes para nada extraordinario, el uso del mismo pareciera una sobrecarga innecesaria. Pero tenga presente que es útil para aquellos casos en los cuales se requiere tener control sobre los elementos o cabecera del mensaje, tales como la resolución de problemas de seguridad del mensaje o problemas de interoperabilidad.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=484035" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=484035</wfw:commentRss></entry><entry><title>WCF bajo contrato (2/4)</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/03/483623.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:483623</id><created>2008-07-03T11:00:00Z</created><content type="text/html" mode="escaped">&lt;h3&gt;&lt;a name="contrato-datos"&gt;Contrato de Datos&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;WCF emplea, de forma predeterminada, a la clase &lt;strong&gt;DataContractSerializer&lt;/strong&gt; como mecanismo de serialización de datos .NET desde y hacia XML, el cual requiere que los tipos tengan un contrato de datos definido. &lt;/p&gt; &lt;p&gt;Hasta ahora el servicio utiliza tipos simples (string) para el intercambio de datos (en el parámetro de entrada y el valor devuelto) sin ninguna preparación. Esto se debe a que ciertos tipos del .NET Framework, entre ellos los "primitivos", tienen contratos de datos predeterminados. Si lo desea puede consultar la lista de los &lt;a href="http://msdn.microsoft.com/library/ms731923.aspx"&gt;tipos admitidos por el DataContractSerializer&lt;/a&gt;.  &lt;p&gt;En caso que deseáramos utilizar nuestros propios tipos de datos, necesitamos definir tipos complejos. Para ello debemos crear tipos que tengan un contrato de datos definido, lo cual conseguimos aplicando el atributo &lt;b&gt;DataContract&lt;/b&gt; a las clases, estructuras y/o enumeraciones a ser serializables por el DataContractSerializer. Además de lo anterior debemos aplicar el atributo &lt;strong&gt;DataMember&lt;/strong&gt; a los miembros que deseemos sean serializables, sin que importe su modificador de acceso.&lt;/p&gt; &lt;p&gt;Continuando con nuestro ejemplo, supongamos que ahora deseamos utilizar los siguientes tipos para el intercambio de datos:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de HelloData.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;&lt;b&gt;
using System.Runtime.Serialization;&lt;/b&gt;

namespace hello.data
{
    &lt;strong&gt;[DataContract(Namespace="http://hello/data/")]&lt;/strong&gt;
    public class Person
    {
        private string firstName;
        private string lastName;

        &lt;strong&gt;[DataMember()]&lt;/strong&gt;
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }

        &lt;strong&gt;[DataMember()]&lt;/strong&gt;
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }

    &lt;strong&gt;[DataContract(Namespace="http://hello/data/")]&lt;/strong&gt;
    public class HelloCard
    {
        private string greeting;
        private int serial;

        &lt;strong&gt;[DataMember()]&lt;/strong&gt;
        public string Greeting
        {
            get { return greeting; }
            set { greeting = value; }
        }

        public int Serial
        {
            get { return serial; }
            set { serial = value; }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Nótese que son clases "planas" con los atributos que definen el contrato de datos. Observe también la declaración del espacio de nombre del .NET Framework: &lt;i&gt;System.Runtime.Serialization&lt;/i&gt;, a cuyo ensamblado debemos referenciar para compilar HelloData.cs:&lt;/p&gt;&lt;pre&gt;&gt;csc /t:library HelloData.cs /r:&lt;b&gt;System.Runtime.Serialization.dll&lt;/b&gt;&lt;/pre&gt;
&lt;p&gt;Una vez definidos los tipos personalizados, ahora definimos el nuevo contrato de servicio, y reescribimos su implementación, como se lista a continuación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
using System.ServiceModel;
using hello.data;

namespace hello
{
  [ServiceContract(Namespace="http://hello/")]
  interface IHello
  {
    [OperationContract()]
    public &lt;b&gt;HelloCard&lt;/b&gt; SayHello(&lt;b&gt;Person&lt;/b&gt; person);
  }

  [ServiceBehavior(Namespace="http://hello/", Name="HelloService")] 
  public class Hello : IHello
  {
    private StringBuilder message = new StringBuilder("Hola ");
  
    [OperationContract(Namespace="http://hello/")]
    public &lt;b&gt;HelloCard&lt;/b&gt; SayHello(&lt;b&gt;Person&lt;/b&gt; person)
    {      
      if (person == null ||
      person.FirstName == null || 
      person.FirstName.Length == 0)
        throw new FaultException("Objeto Person inválido.");
      &lt;b&gt;message.Append(person.FirstName + "!");
     &lt;/b&gt;string msg = message.ToString();&lt;b&gt;
     HelloCard card = new HelloCard();
     card.Greeting = msg;
     &lt;/b&gt;System.Console.WriteLine(msg);&lt;b&gt;
     return card;&lt;/b&gt;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: En el código se altera la interfaz del contrato del servicio, cuando en la práctica se debe definir una nueva interfaz e implementarla. Se hizo así para simplicidad del ejemplo.&lt;/p&gt;
&lt;p&gt;Ahora compilamos el servicio agregando la referencia al ensamblado generado previamente:&lt;/p&gt;&lt;pre&gt;&gt;csc /t:library Hello.cs /r:System.ServiceModel.dll,&lt;b&gt;HelloData.dll&lt;/b&gt;&lt;/pre&gt;
&lt;p&gt;El host y su archivo de configuración permanecen sin cambios, por lo que solo resta ejecutar HelloHost.exe. &lt;/p&gt;
&lt;p&gt;Ahora pasamos al cliente. Primero regeneramos los artefactos cliente con svcutil.exe como hasta ahora, y después modificamos el código de la aplicación cliente, tal como se aprecia a continuación:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {
      hello.IHello service = new hello.HelloClient();&lt;b&gt;
      hello.data.Person person = new hello.data.Person();
      person.FirstName = arg;
      hello.data.HelloCard card = service.SayHello(person);
      result = card.Greeting;&lt;/b&gt;
    }
    catch (System.ServiceModel.FaultException fault) 
    { 
      result = fault.Message; 
    }
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Compilamos los archivos del proxy y el cliente, y ejecutamos Client.exe como hasta ahora.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nota&lt;/b&gt;: Además de DataContractSerializer, WCF también admite (de forma excluyente) la clase &lt;b&gt;XmlSerializer&lt;/b&gt;, que es el mismo mecanismo de serialización utilizado en Servicios Web ASP.NET (aka ASMX). Aunque XmlSerializer solo admite un conjunto reducido de tipos, permite un mayor control sobre el XML resultante y admite mejor la norma de XSD. Para más información consulte &lt;a href="http://msdn.microsoft.com/library/ms733901.aspx"&gt;Utilización de XMLSerializer&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=483623" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=483623</wfw:commentRss></entry><entry><title>WCF bajo contrato (1/4)</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/07/02/483355.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:483355</id><created>2008-07-02T18:25:44Z</created><content type="text/html" mode="escaped">&lt;p&gt;Como continuación al artículo &lt;a href="https://willyxoft.wordpress.com/articulos/servicios-web-wcf/"&gt;Servicios Web con WCF: Una sencilla introducción a Servicios Web con WCF&lt;/a&gt;, la presente serie abordará de manera sencilla los principales tipos de contratos que se emplean para definir los Servicios de WCF. La finalidad es dar una introducción práctica a los mismos, sin pretender ser exhaustivo. Así que partiendo del servicio Hello del artículo anterior, comencemos por el &lt;em&gt;Contrato de Servicio&lt;/em&gt;.&lt;/p&gt; &lt;h3&gt;&lt;a name="contrato-servicio"&gt;Contrato de Servicio&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;Un contrato de servicio permite la comunicación con el mismo, al proporcionar la siguiente información:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Listado de las operaciones que ofrece y la ubicación de las mismas  &lt;li&gt;Firma de las operaciones, en términos de intercambio de mensajes  &lt;li&gt;Tipos de datos empleados en los mensajes.  &lt;li&gt;Protocolos concretos y formatos de serialización.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Para esto se utilizan los documentos WSDL y XSD, que son lenguajes estándar para describir servicios web. No obstante WSDL y XSD son difíciles de utilizar, por ello las aplicaciones WCF utilizan atributos, interfaces y clases para definir la estructura de un servicio e implementar un servicio.&lt;/p&gt; &lt;p&gt;En el artículo anterior se define el contrato del servicio utilizando la clase de implementación del mismo. Sin embargo es recomendable utilizar una interfaz para ello, ya que, al igual que un contrato de servicios, las interfaces solo definen la agrupación de métodos (operaciones) con ciertas firmas sin especificar ningún detalle sobre su implementación. Además, todas las ventajas de las interfaces administradas se aplican a las interfaces de contrato de servicio: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Las interfaces pueden extender cualquier número de interfaces.  &lt;li&gt;Una única clase puede implementar cualquier número de interfaces.  &lt;li&gt;Puede modificar la implementación de una interfaz, mientras la interfaz siga siendo la misma.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Por lo que adicionalmente se puede controlar la versión del servicio implementando la interfaz antigua y la nueva. Los clientes antiguos se conectan a la versión original, mientras los clientes más nuevos pueden conectarse a la versión más nueva.&lt;/p&gt; &lt;p&gt;Así que, tras realizar &lt;i&gt;refactoring&lt;/i&gt; al Servicio WCF Hello, el contrato y su implementación ahora quedan de la siguiente forma:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Listado de Hello.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;
using System.Text;
using System.ServiceModel;

namespace hello
{  

  [&lt;b&gt;ServiceContract&lt;/b&gt;(Namespace="http://hello/")]
  interface IHello
  {
    [&lt;b&gt;OperationContract&lt;/b&gt;()]
    &lt;b&gt;string SayHello(string name);&lt;/b&gt;
  }
    
  [&lt;b&gt;ServiceBehavior&lt;/b&gt;(Namespace="http://hello/", Name="HelloService")]    
  public class Hello : &lt;b&gt;IHello&lt;/b&gt;
  {
    private StringBuilder message = new StringBuilder("Hola ");

    public string SayHello(string name)
    {
      &lt;font color="#808000"&gt;if (name == null || name.Length == 0)
        throw new FaultException("Parámetro 'name' nulo o vacío.");&lt;/font&gt;
      string msg = message.Append(name + "!").ToString();
      System.Console.WriteLine(msg);
      return msg;
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Observe que ahora los atributos ServiceContract y OperationContract se aplican a la interfaz, y que a la clase de implementación sólo se la aplica el atributo ServiceBehavior. Recuerde que los dos primeros atributos definen el contrato del servicio y sus operaciones, mientras que el tercero define comportamientos concretos de la implementación. En el ejemplo los utilizamos para marcar las responsabilidades de cada una, así como el namespace a utilizar en la exportación hacia el WSDL.&lt;/p&gt;
&lt;p&gt;Tras compilar el servicio:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll&lt;/pre&gt;
&lt;p&gt;Continuamos con el host. El código de HelloHost.cs permanece sin cambios, pero tenemos que hacer un ligero cambio al archivo de configuración HelloHost.exe.config, de modo ahora el atributo &lt;em&gt;contract&lt;/em&gt; del endpoint señale a la interfaz:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de HelloHost.exe.config&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;system.serviceModel&amp;gt;
    &amp;lt;services&amp;gt;
      &amp;lt;service name="hello.Hello" behaviorConfiguration="enableMetadata"&amp;gt;
        &amp;lt;endpoint &lt;b&gt;contract="hello.IHello"&lt;/b&gt; binding="basicHttpBinding" address="" 
            bindingNamespace="http://hello/" name="HelloPort" /&amp;gt;
        &amp;lt;endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /&amp;gt;
      &amp;lt;/service&amp;gt;
    &amp;lt;/services&amp;gt;
    &amp;lt;behaviors&amp;gt;
      &amp;lt;serviceBehaviors&amp;gt;
        &amp;lt;behavior name="enableMetadata" &amp;gt;
          &amp;lt;serviceMetadata httpGetEnabled="true" /&amp;gt;
        &amp;lt;/behavior&amp;gt;
      &amp;lt;/serviceBehaviors&amp;gt;
    &amp;lt;/behaviors&amp;gt;
  &amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;Tras ejecutar el host:&lt;/p&gt;&lt;pre&gt;&amp;gt;HelloHost.exe

El Servicio Web Hello se esta ejecutando...
WSDL: http://localhost:8080/Hello?wsdl
Presione una tecla para cerrarlo.&lt;/pre&gt;
&lt;p&gt;Ahora vamos con el cliente. Primero debemos regenerar los artefactos cliente con svcutil:&lt;/p&gt;&lt;pre&gt;&amp;gt;svcutil http://localhost:8080/hello?wsdl /out:Hello.cs /config:Client.exe.config /n:http://hello/,hello&lt;/pre&gt;
&lt;p&gt;Después modificamos una línea del código de la aplicación cliente:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Listado de Client.cs&lt;/b&gt;&lt;/p&gt;&lt;pre&gt;using System;

public class Client
{
  static void Main(string[] args)
  {
    String arg = null;
    String result = null;
    if (args.Length &amp;gt; 0) {
      arg = args[0];
    }
    else {
      arg = "Anónimo";
    }
    try {      
      &lt;b&gt;hello.IHello service = new hello.HelloClient();&lt;/b&gt;
      result = service.SayHello(arg);
    }
    &lt;font color="#808000"&gt;catch (System.ServiceModel.FaultException fault) 
    { 
      result = fault.Message; 
    }&lt;/font&gt;
    catch (Exception ex) {
      result = ex.ToString();
    }
    finally{
      System.Console.WriteLine(result);
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Compilamos tanto el proxy como la aplicación:&lt;/p&gt;&lt;pre&gt;&amp;gt;csc /t:library Hello.cs /r:System.ServiceModel.dll

&amp;gt;csc /t:exe Client.cs /r:System.ServiceModel.dll,Hello.dll&lt;/pre&gt;
&lt;p&gt;Y la ejecución será la misma que la última vez:&lt;/p&gt;&lt;pre&gt;&amp;gt;Client Willy

Hola Willy.&lt;/pre&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=483355" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=483355</wfw:commentRss></entry><entry><title>SQL Server 2008 RC</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/12/476803.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:476803</id><created>2008-06-13T11:23:56Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;em&gt;A comenzado la saga RC de SQL Server 2008, el RTM se acerca...&lt;/em&gt; &lt;/p&gt; &lt;p&gt;&lt;b&gt;SQL Server 2008 Express RC0:&lt;/b&gt; edición funcional ideal para aprender y ejecutar aplicaciones de base de datos de escritorio y de servidor a pequeña escala. SQL Server 2008 Express admite 1 CPU, 1 GB de RAM y bases de datos de hasta 4 GB.  &lt;ul&gt; &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118953&amp;amp;clcid=0x0c0a"&gt;SQL Server Express 2008 x86&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118954&amp;amp;clcid=0x0c0a"&gt;SQL Server Express 2008 x64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ejecute el archivo de descarga para copiar los archivos de instalación en el directorio Temp. La instalación comenzará una vez se haya completado la extracción. No es necesario buscar e iniciar setup.exe manualmente.&lt;/p&gt; &lt;p&gt;&lt;b&gt;SQL Server 2008 Express Advanced RC0:&lt;/b&gt; edición Express que además incluye una plataforma básica de informes y administración de datos con funcionalidad completa.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118955&amp;amp;clcid=0x0c0a"&gt;SQL Server Express Advanced 2008 x86&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=118956&amp;amp;clcid=0x0c0a"&gt;SQL Server Express Advanced 2008 x64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Tanto el formato de archivo de descarga como el inicio del proceso de instalación son idénticos para SQL Express.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SQL Server 2008 RC0&lt;/strong&gt;: versión de prueba para crear y probar cualquier tipo de aplicación. Incluye toda la funcionalidad de SQL Server 2008 Enterprise, pero sólo está autorizado para el uso de desarrollo, prueba y demostración.  &lt;ul&gt; &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=118952&amp;amp;clcid=0x0c0a"&gt;SQL Server 2008 x86&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=118950&amp;amp;clcid=0x0c0a"&gt;SQL Server 2008 x64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ejecute el archivo de descarga. En el símbolo del sistema, seleccione un directorio y pulse &lt;b&gt;Siguiente&lt;/b&gt;. Una vez finalizado el paso de extracción automática, busque y haga doble clic en Setup.exe en el directorio seleccionado para comenzar la instalación.  &lt;p&gt;Además de SQL Server Evaluation, puede probar las ediciones Standard y Enterprise, para ello especifique la clave del producto correspondiente para desbloquear la edición que desea.  &lt;p&gt;&lt;strong&gt;Más información en: &lt;/strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=35f53843-03f7-4ed5-8142-24a4c024ca05&amp;amp;DisplayLang=es"&gt;&lt;strong&gt;SQL Server 2008 Release Candidate 0&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=476803" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=476803</wfw:commentRss></entry><entry><title>Silverlight 2 Beta 2</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/07/474685.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:474685</id><created>2008-06-07T18:57:27Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;img src="http://www.aecomo.org/images/microsoft-silverlight.jpg" align="right"&gt;Microsoft ha liberado la segunda beta pública de Silverlight 2.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;¿Que es Silverlight?&lt;/p&gt; &lt;p&gt;Silverlight (antes WPF/E) es una nueva tecnología de presentación Web propuesta por Microsoft, creada para su ejecución en distintos browser HTTP y en múltiples dispositivos y sistemas operativos de escritorio. Al igual que WPF (Windows Presentation Foundation), la tecnología de presentación en Microsoft .NET Framework 3.0: XAML (eXtensible Application Markup Language), constituye la base de la capacidad de presentación de Silverlight.  &lt;p&gt;Parafraseado de &lt;a href="http://www.microsoft.com/spanish/msdn/articulos/archivo/010507/voices/bb404300.mspx"&gt;Introducción a Silverlight&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Algunas características de Siverlight 2 Beta 2:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Soporte de lenguajes .NET: VB.NET, C#, Iron Python e IronRuby  &lt;li&gt;Nuevo conjunto de controles (Button, ListBox, Slider, CheckBox, DataGrid, Calendar, TabPanel, etc.)  &lt;li&gt;Edición de plantilla de controles  &lt;li&gt;VSM (Visual State Manager)  &lt;li&gt;Caching cliente  &lt;li&gt;Soporte para WCF  &lt;li&gt;Programación XML  &lt;li&gt;LINQ to XML y LINQ to Objects  &lt;li&gt;ADO.NET Data Services  &lt;li&gt;&lt;a href="http://labs.live.com/Silverlight+2+Deep+Zoom.aspx"&gt;Tecnología Deep Zoom&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Descargas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/silverlight/resources/install.aspx?v=2.0"&gt;Silverlight 2 Beta 2 plug-in (runtime)&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ba7b510d-0646-4d06-9834-cb82d669872a&amp;amp;DisplayLang=en"&gt;Silverlight 2 Beta 2 SDK&lt;/a&gt;  &lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=120319"&gt;Silverlight 2 Beta 2 Tools for Visual Studio 2008&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Mayor información:  &lt;ul&gt; &lt;li&gt;&lt;a href="http://silverlight.net/GetStarted/overview.aspx"&gt;Silverlight Overview&lt;/a&gt;  &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/06/06/silverlight-2-beta2-released.aspx"&gt;Silverlight 2 Beta2 Released&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=474685" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=474685</wfw:commentRss></entry><entry><title>Velocidad de datos</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/07/474683.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:474683</id><created>2008-06-07T18:30:21Z</created><content type="text/html" mode="escaped">&lt;p&gt;El equipo de Datos de Microsoft se encuentra trabajando en un proyecto de caching llamado "Velocity" del cual ya ha publicado el primer CTP. Pretenden que el producto resultante del proyecto sea una plataforma de caché en memoria que proporcione a las aplicaciones .NET el acceso a datos a alta velocidad, de forma escalable y con alta disponibilidad. &lt;/p&gt; &lt;p&gt;&lt;img height="310" src="http://msdn.microsoft.com/es-mx/library/cc645013.image002.jpg" width="583"&gt;&lt;/p&gt; &lt;p&gt;Principales características:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Almacenamiento de cualquier objeto CLR serializable y acceso mediante APIs simples  &lt;li&gt;Caché de alto desempeño para todas la aplicaciones de datos  &lt;li&gt;Ejecución tanto como servicio de red como embebido en aplicaciones  &lt;li&gt;Soporte para las configuraciones más comunes de caché  &lt;li&gt;Escalamiento dinámico  &lt;li&gt;Balanceo de carga automático  &lt;li&gt;Compatibilidad con ASP.NET e IIS.  &lt;li&gt;Alta disponibilidad al mantener copias de datos en múltiples nodos  &lt;li&gt;Soporte de múltiples lenguajes del lado cliente (PHP, C#, C++, etc.)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Para mayor información visitar:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/data/cc655792.aspx"&gt;Microsoft Project Code Named “Velocity”&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/velocity/archive/2008/06/04/project-velocity-ctp1-features.aspx"&gt;Project Velocity CTP1 Features&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=474683" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=474683</wfw:commentRss></entry><entry><title>Guia de Seguridad WCF (Beta)</title><link rel="alternate" type="text/html" href="http://dotnetjunkies.com/WebLog/vbpuntonet/archive/2008/06/07/474684.aspx" /><id>58df7014-fd75-437c-9641-150997716d1c:474684</id><created>2008-06-07T18:38:40Z</created><content type="text/html" mode="escaped">&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=WCFSecurityGuide&amp;DownloadId=35620" align="right"&gt;  &lt;p&gt;El equipo de patterns &amp; practices ha publicado la versión beta de su guía de seguridad en Servicios Web titulada: &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Improving Web Services Security: Scenarios and Implementation Guidance for WCF&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;En la cual se muestra cómo mejorar la seguridad de WCF mediante escenarios, guías directivas, Preguntas &amp; Respuestas, listados Como-Se-Hace, etc... La guía está relacionada con el proyecto de seguridad: &lt;a href="http://www.codeplex.com/WCFSecurity"&gt;WCF Security Guidance Project&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Mayor información y descarga de la guía en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/WCFSecurityGuide" href="http://www.codeplex.com/WCFSecurityGuide"&gt;WCF Web Services Security Guide&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://dotnetjunkies.com/WebLog/aggbug.aspx?PostID=474684" width="1" height="1"&gt;</content><slash:comments>0</slash:comments><wfw:commentRss>http://dotnetjunkies.com/WebLog/vbpuntonet/commentrss.aspx?PostID=474684</wfw:commentRss></entry></feed>