<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Carlos J. Valera</title>
	<atom:link href="http://cvalera.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://cvalera.wordpress.com</link>
	<description>Microsoft Student Partners Venezuela</description>
	<pubDate>Fri, 18 Jul 2008 17:52:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>es</language>
			<item>
		<title>Conoces el tema de Virtualización?</title>
		<link>http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/</link>
		<comments>http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 17:52:27 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/</guid>
		<description><![CDATA[Aunque es un tema que parece nuevo, la Virtualización tiene muchos años, quizás décadas, de estudios para ser lo que es ahora.

Pero, en realidad que es? Para qué sirve?

Cuando nos referimos a Virtualización hacemos referencia a agrupar los recursos informáticos en equipos virtuales de forma que los usuarios no aprecien la naturaleza física y los [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><span style="font-family:Arial;font-size:12pt;">Aunque es un tema que parece nuevo, la Virtualización tiene muchos años, quizás décadas, de estudios para ser lo que es ahora.<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Pero, en realidad que es? Para qué sirve?<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Cuando nos referimos a Virtualización hacemos referencia a agrupar los recursos informáticos en equipos virtuales de forma que los usuarios no aprecien la naturaleza física y los limites de dichos recursos. De forma resumida, la Virtualización es la anulación de la dependencia del software con respecto al hardware.<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Para tener una idea de lo que es Virtualización debemos conocer algunos procesos, entre ellos tenemos Virtualización mediante hipervisor o en otras palabras Monitor de equipo virtual. Aquí la Virtualización de <img align="left"/>los equipos se consigue mediante una capa de software denominada &#8220;monitor del equipo virtual&#8221; que se sitúa entre el sistema operativo y el hardware. Dicha capa proporciona acceso a los recursos de hardware y permite ejecutar varios sistemas operativos distintos en una sola maquina o servidor (host).<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Actualmente dos tipos de Virtualización han sacudido los entornos de datos, hasta ganarse el respeto en el tema.<br />
</span></p>
<ul>
<li><span style="font-family:Arial;"><span style="font-size:12pt;">El primero de ellos es conocido como </span><span style="font-size:14pt;"><strong>Virtualización total</strong>,</span><span style="color:black;font-size:12pt;">  donde el hardware o el software (o una combinación de ambos) simulan una plataforma completa con el fin de permitir la ejecución de un sistema operativo sin modificaciones. Usando este método no es necesario personalizar el sistema operativo invitado. Sin embargo, como el sistema operativo se ha diseñado para su funcionamiento en hardware físico, éste no detecta el monitor del equipo virtual, ya sea en forma de hipervisor o de solución de host. Como resultado, el equipo virtual no podrá colaborar con otros para compartir recursos y mejorar el rendimiento.<br />
</span></span></li>
</ul>
<p>
 </p>
<ul>
<li><span style="font-family:Arial;"><span style="color:black;font-size:12pt;">El segundo </span><span style="font-size:14pt;"><strong>Paravirtualización</strong></span><span style="color:black;font-size:12pt;">, al contrario de lo que ocurre con la virtualización total, en este se simula el hardware sólo de forma parcial. Este término hace referencia a las modificaciones realizadas en un sistema operativo con el fin de mejorar el rendimiento en entornos virtuales. El hipervisor colabora con las API que permiten abstraer los recursos de hardware del equipo virtual. Para que la paravirtualización funcione es preciso modificar las partes del sistema operativo invitado que dependan del hardware de modo que éstas detecten la capa de virtualización. El hipervisor evita las instrucciones del procesador difíciles de llevar a cabo en un entorno virtual y las sustituye por una llamada de procedimiento que proporciona esa función. De este modo, los equipos paravirtuales suelen rendir mejor que los equipos con virtualización total. La paravirtualización está ganando cada vez mayor popularidad debido a que se obtiene un mejor rendimiento con los chips existentes. Además, ofrece grandes ventajas en combinación con la última generación de chips x86 compatibles con la virtualización como los dispositivos Intel* VT y AMD-V. Asimismo, permite compartir la memoria conjunta entre equipos sin modificar el sistema operativo host.<br />
</span></span></li>
</ul>
<p>
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">El tema de Virtualización es un poco difícil y profundo pero no es imposible de entender, lo digo por experiencia, ya que escuche por primera vez de esto hace algunos meses y desde entonces he leído mucho de él pero claro está que no soy ningún especialista.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">Bueno entonces sigamos,<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">La Virtualización en opinión personal es muy importante hoy debido a la gran variedad de sistemas operativos (SO) que existen tanto de Software Propietario como de Software Libre, y existe la posibilidad de probar varios de ellos por decirlo de algún modo, al mismo tiempo, además de este punto la forma en que se pueden reducir los costos en las empresas también da un punto a favor para la utilización del mismo.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="font-family:Arial;"><span style="color:black;font-size:12pt;">Cuando probé por primera vez lo que era en realidad virtualizar, lo hice en una máquina no tan potente y logre correr sobre </span><span style="font-size:14pt;"><strong>Windows Vista Ultimate</strong></span><span style="color:black;font-size:12pt;"> 3 maquinas virtuales gracias a las bondades de </span><span style="font-size:14pt;"><strong>Virtual PC 2007</strong></span><span style="color:black;font-size:12pt;">, entre ellas estaba Windows XP Professional Service Pack 2, Ubuntu 7.10 y Windows Server 2008. La experiencia fue muy buena ya que puedes interactuar con no solo un SO sino con tres, puedes compartir el hardware utilizando quizás la unidad de CD, un  puerto USB, etc.<br />
</span></span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">A pesar de que solo he hecho utilización de la virtualización para pruebas sencillas de Sistemas Operativos, una de las muchas utilidades que tiene la virtualización es usarla en la parte de servidores.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="font-family:Arial;font-size:14pt;"><strong>Algunos de Los beneficios de la virtualización que pueden experimentar los clientes por su implementación:<br />
</strong></span></p>
<p style="margin-left:18pt;">
 </p>
<p>
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Aumentar la utilización de los servidores. Al facilitar la consolidación de las aplicaciones y los servidores físicos, la virtualización permite utilizar los recursos de hardware de forma más eficaz y, por tanto, reducir los costos inmobiliarios, de electricidad, mantenimiento y hardware. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Aumentar la continuidad empresarial y el tiempo de actividad del sistema. Los clientes pueden reducir los riesgos que entrañan los períodos de inactividad imprevistos mediante la migración de cargas de trabajo heterogéneas a equipos virtuales y la consiguiente migración de estos sistemas virtuales a equipos físicos distintos. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Aprovechar el exceso de capacidad del centro de datos y mejorar los tiempos de respuesta. Al equilibrar las cargas informáticas en los recursos de los centros de datos durante las horas de mayor actividad, el funcionamiento de los equipos resultará más eficaz y rentable. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Redistribuir los recursos de servidores físicos. Gracias a la virtualización, los clientes podrán migrar cargas de trabajo de servidores a redes virtuales y liberar recursos físicos que se pueden quitar o redistribuir para otros usos. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Ofrecer portabilidad y flexibilidad de aplicaciones a las plataformas de hardware. Las aplicaciones se pueden ejecutar en cualquier hardware capaz de adoptar la abstracción propia de la virtualización. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-size:12pt;"><span style="font-family:Arial;">• <em>Mejorar la productividad en tareas administrativas y la capacidad de respuesta. La virtualización permite que las empresas de TI mejoren la productividad en tareas administrativas e implanten nuevos servidores de forma rápida y sistemática con el fin de adaptarse a las cambiantes necesidades empresariales.</em></span><span style="font-family:Arial;"><em><br />
				</em><br />
			</span></span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">En el centro de datos, la virtualización es una tendencia en alza ya que las nuevas tecnologías cuentan con el potencial necesario para solucionar los problemas relacionados con la eficacia, la capacidad de ampliación, la facilidad de administración y el aprovechamiento de los recursos. Provistos de equipos virtuales, los administradores de los centros de datos pueden crear nuevos niveles de flexibilidad y agilidad en sus entornos con un costo total de la propiedad menor.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">La virtualización puede mejorar el aprovechamiento de los recursos en servidores individuales y, de este modo, economizar aún más esas inversiones. Además, permite la integración de sistemas distribuidos, gracias a que un conjunto heterogéneo de servidores de cálculo y almacenamiento se transformaría en una auténtica plataforma informática empresarial.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="font-family:Arial;"><span style="color:black;font-size:12pt;">Mi recomendación hoy es implementar la virtualización, háganlo solo por pruebas con dos o tres sistemas operativos, además recomiendo que si tienes Windows® instales en tu máquina </span><span style="font-size:14pt;"><strong>Microsoft® Virtual PC 2007</strong></span><span style="color:black;font-size:12pt;"> que es la herramienta que nos permite virtualizar localmente los sistemas que queramos, incluso cabe destacar que dicha herramienta es gratuita desde la página de Microsoft®.<br />
</span></span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=21&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Microsoft cambia su estrategia para atacar la piratería del Vista</title>
		<link>http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/</link>
		<comments>http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 21:00:22 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/</guid>
		<description><![CDATA[Microsoft anunció que el Service Pack 1 (SP1) del Windows Vista, a lanzarse durante el primer trimestre de 2008, frenará los dos métodos más utilizados por los piratas informáticos para hacer copias ilegales del sistema operativo.
En primer lugar, corregirá una vulnerabilidad vinculada al BIOS de la motherboard, que permite a los piratas simular el proceso [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Microsoft anunció que el Service Pack 1 (SP1) del Windows Vista, a lanzarse durante el primer trimestre de 2008, frenará los dos métodos más utilizados por los piratas informáticos para hacer copias ilegales del sistema operativo.</p>
<p>En primer lugar, corregirá una vulnerabilidad vinculada al BIOS de la motherboard, que permite a los piratas simular el proceso de activación que utilizan algunos fabricantes de computadoras para instalar Vista en las computadoras que comercializan.</p>
<p>En segundo lugar, añadirán medidas para impedir las técnicas aplicadas a extender, de manera ilimitada, el &#8220;periodo de gracia&#8221; que otorga la compañía entre la instalación y la activación del Vista.</p>
<p>Microsoft también cambiará la forma de tratar las versiones pirateadas del nuevo Windows. En la actualidad, cuando se detecta una copia ilegal o no se lo activa a tiempo, el sistema operativo queda limitado en funciones.</p>
<p>Con el SP1, los usuarios recibirán ahora notificaciones periódicas de que su versión del software es fraudulenta, con un enlace para comprar una copia auténtica.</p>
<p>Según el grupo empresarial Business Software Alliance, en torno al 35 por ciento del software para usuarios del mundo está pirateado. Windows, presente en más del 90 por ciento de las computadoras del mundo, es el producto que más se copia ilegalmente.</p>
<p>Al finalizar septiembre, la empresa había vendido 88 millones de licencias de Vista. Las mejoras para reducir la piratería implementadas en el sistema operativo lograron incrementar en un 25 por ciento las ventas de Windows durante el tercer trimestre del año.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=18&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>El Domingo Venezuela amanecerá con nueva hora legal</title>
		<link>http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/</link>
		<comments>http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 20:24:57 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/</guid>
		<description><![CDATA[Venezuela y su mencionado cambio de Horario!!!!! 
El 9 de diciembre a las tres de la madrugada se implementará de manera oficial la nueva hora legal en Venezuela, la cual se aplicará retrasando los relojes media hora. 
Donatella Pizzi de Machado, corredactora de la Ley de Metrología Explicó que el meridiano escogido es más céntrico al país. [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3><span class="notatitulo">Venezuela y su mencionado cambio de Horario!!!!! </span></h3>
<p><span class="notatitulo"><font size="2">El 9 de diciembre a las tres de la madrugada se implementará de manera oficial la nueva hora legal en Venezuela, la cual se aplicará retrasando los relojes media hora. </font></span><span class="notatitulo"></span><span class="notatitulo"></span><span class="notatitulo"></p>
<p align="justify"><font size="2">Donatella Pizzi de Machado, corredactora de la Ley de Metrología Explicó que el meridiano escogido es más céntrico al país. &#8220;Esas decisiones hay que tomarlas en su globalidad porque vivimos en un país con conexiones internacionales; entonces no es solamente la posición que tiene, sino lo que implica lo que es un sistema horario internacional, en el cual se procura tener horas enteras para el mejor manejo de las horas bajo todo aspecto de vista, comunicacional, comercial y económico&#8221;.</font></p>
<p align="justify"><font size="2">Indicó que a su vez salimos de la alineación que teníamos con cinco países &#8220;lo cual nos conviene comercialmente hablando del continente&#8221;. </font><font size="2">Destacó que en la Gaceta Oficial ya está establecido el Meridiano 67º 30â€™, el cual es el mismo que tenía Venezuela en 1912. </font></p>
<p align="justify"><font size="2">Manifestó que desde que se elaboró la propuesta, hasta el momento en que se va a implementar ha habido una serie que restricciones y de cambios convenientes; sin embargo considera que &#8220;son demasiados cambios para los efectos reales que va a tener esta medida, demasiados ajustes a líneas aéreas, ajuste de maquinarias, entre otros cambios&#8221;.</font></p>
<p align="justify">Por otra parte el ministro del Poder Popular para Ciencia y Tecnología, Héctor Navarro. Su señalamiento lo hizo este viernes al ser entrevistado en Venevisión. Explicó que se trata de una medida que tiene que ver con la salud pública, &#8216;por lo que todos tenemos que tener un mínimo de racionalidad al respecto y acatarla”. <strong>Este domingo 9/12, a las 3:00 de la mañana, con motivo del cambio de la hora legal de Venezuela los relojes deberán retrasarse media hora.</strong> No obstante, Navarro señaló que no es necesario que los venezolanos se levanten a esa hora para retrasar el reloj, con que lo hagan al levantarse el domingo es suficiente. Hizo la salvedad de que quienes sí deben hacerlo a esa hora son los que llevan la hora legal de Venezuela en el Observatorio Cagigal, porque tienen una responsabilidad internacional, así como los que tienen que ver con los prestadores de servicios de telefonía.</p>
<p align="justify"> Asi que no se preocupen por retrasar sus relojes el domingo en la madrugada, cuando despierten en la mañana o al mediodia o incluso en la noche (ya que hay personas que duermen todo el dia) pueden hacerlo. <strong>Recuerden quitenle 30 minutos y listo</strong>!</p>
<p></span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=17&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Zona horaria nueva en Venezuela???</title>
		<link>http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/</link>
		<comments>http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/#comments</comments>
		<pubDate>Fri, 05 Oct 2007 13:50:06 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/</guid>
		<description><![CDATA[Ultimamente se ha venido escuchando en nuestro país algo de un cambio de horario parece ser que se le restara 30 minutos a la hora normal, según esto empezaria a partir del 1 de octubre pero tambien escuche a un amigo diciendo que ya ese cambio no se realizara.
Bien sea o no el caso ya que [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ultimamente se ha venido escuchando en nuestro país algo de un cambio de horario parece ser que se le restara 30 minutos a la hora normal, según esto empezaria a partir del 1 de octubre pero tambien escuche a un amigo diciendo que ya ese cambio no se realizara.</p>
<p>Bien sea o no el caso ya que no es mi objetivo hablar de si el Gobierno cambia o no, El Presidente lo anunció y lo que se queria hacer era un cambio a la zona horaria para el país el cual hasta fecha normalmente que habia observado Hora estándar de Occidental de Sudamérica. Según informes oficiales, aún hay una fecha de comienzo de zona horaria nueva para determinarse pero proyectarse para producir antes de 31 de diciembre de 2007.</p>
<p>Debido a ese alboroto, Microsoft publicó una actualización para el sistema operativo Windows (Windows XP, Windows Server 2003 y Windows Vista) que ya está disponible para permitir que pruebe y que implemente la zona horaria nueva para Caracas, Venezuela antes de un anuncio oficial de la fecha de moverse a la zona horaria nueva a clientes y socios.<br />
Al mover a sus clientes Windows a la zona horaria nueva, se moverán relojes de atrás 30 minutos de UTC &#8211;4 : 00 a UTC &#8211;4 : 30. Este cambio se comienza en hora local 11:59:59 p.m. en la fecha de comienzo. Los relojes deberían estar movidos de nuevo a 11:30:00 p.m. en vez de que debido avanzar a 12 :00:00 AM (medianoche).</p>
<p>Microsoft recomienda que los clientes que actualizan manualmente su información de zona horaria utilizando esta actualización mantengan sus configuraciones de zona horaria actual y que confirmen la fecha de comienzo del cambio de zona horaria en el República de Venezuela Bolivariana antes de utilizar la zona horaria nueva.</p>
<p>Usuarios finales pueden realizar esta actualización. La zona horaria nueva resultante puede permanecer en la ficha de zona horaria puede tener un nombre para mostrar de la Paz (GMT-04:00) hasta que el usuario haga una transición a Hora estándar de Venezuela manualmente. También esta zona horaria es Hora estándar de Occidental suramericana.</p>
<p>Utilizar esta zona horaria nueva antes que el cambio de zona horaria oficial afecte a la fecha y al tiempo en su equipo.</p>
<p>Bueno en realidad no estoy seguro si en realidad cancelaron el cambio de horario pero ya Microsoft se adelanto a esa desición y ya tenemos una zona horaria para Venezuela.</p>
<p>Fuente: <a href="http://support.microsoft.com/kb/938977">http://support.microsoft.com/kb/938977</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=16&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Microsoft .NET Framework 3.0</title>
		<link>http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/</link>
		<comments>http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/#comments</comments>
		<pubDate>Sun, 23 Sep 2007 23:08:05 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/</guid>
		<description><![CDATA[.NET Framework
La API principal contiene clases compartidas por todos los tipos de aplicaciones de .NET Framework 3.0.
Forman parte en gran medida del espacio de nombres System, así como de los descendientes tal como System.Collections. Las API de .NET Framework incluyen compatibilidad con:



•


Tipos de referencia y valor básico, como INT 32, String y URI




•


Colecciones y Estructuras [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h2>.NET Framework</h2>
<p>La API principal contiene clases compartidas por todos los tipos de aplicaciones de .NET Framework 3.0.</p>
<p>Forman parte en gran medida del espacio de nombres <strong>System</strong>, así como de los descendientes tal como<strong> System.Collections.</strong> Las API de .NET Framework incluyen compatibilidad con:</p>
<table border="0" width="594" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">
<h3>•</h3>
</td>
<td class="listItem">
<h6>Tipos de referencia y valor básico, como INT 32, String y URI</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h3>•</h3>
</td>
<td class="listItem">
<h6>Colecciones y Estructuras de Datos</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Data</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Graficos y Dibujos</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Entrada/salida</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Redes básicas</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Seguridad</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Servicios de tiempo de ejecución y subprocesamiento</h6>
</td>
</tr>
</table>
<p>.NET Framework también proporciona compatibilidad para crear aplicaciones Web y para Windows.</p>
<p>ASP.NET es una plataforma Web unificada que proporciona todos los servicios necesarios para generar aplicaciones Web de clase empresarial. Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Web o sus descendientes.</p>
<p>Windows Forms es una plataforma para desarrollar aplicaciones de cliente Windows. Una aplicación de Windows Forms también puede actuar como interfaz de usuario local en una solución distribuida de varios niveles. Windows Forms amplía la API principal con un claro conjunto orientado a objetos extensible de clases que permiten desarrollar aplicaciones avanzadas de cliente Windows. Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Windows.Forms o sus descendientes.</p>
<h2>Microsoft® Windows® Communication Foundation</h2>
<p>Windows Communication Foundation es la nueva infraestructura de comunicación orientada a servicios creada sobre la base de protocolos de servicios Web. La compatibilidad del servicio Web avanzado en Windows Communication Foundation proporciona una mensajería interoperable, segura, confiable y por transacciones.El modelo de programación orientado a servicios de Windows Communication Foundation se basa en .NET Framework y simplifica radicalmente el desarrollo de sistemas conectados. Unifica una amplia gama de capacidades de sistemas distribuidos en una arquitectura extensible que se puede componer y que admite varios transportes, patrones de mensajería, codificaciones, topologías de red y modelos de hospedaje. Es la nueva versión de varios productos existentes: Los métodos Web de ASP.NET (“ASMX”) y Microsoft Web Services Enhancements para Microsoft .NET (WSE), .NET Remoting, Enterprise Services y System.Messaging.</p>
<p>Las clases que constituyen la API de Windows Communication Foundation forman parte en gran medida del espacio de nombres System.ServiceModel y sus subespacios de nombres. Windows Communication Foundation admite una gran variedad de escenarios, que incluyen:</p>
<table border="0" width="637" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">
<h6>Mensajería unidireccional y dúplex</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Llamadas a procedimientos remotos síncronas y asíncronas</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Devoluciones de llamadas</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Sesiones</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Servicios de varios contratos</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Seguridad basada en transporte y mensajes, confiabilidad y entrega ordenada</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Mensajes en cola</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Compatibilidad con transacciones</h6>
</td>
</tr>
</table>
<h2>Microsoft® Windows® Presentation Foundation</h2>
<p>Windows Presentation Foundation es un subsistema de presentaciones unificado de Microsoft para Windows. Consta de un motor de visualización y un conjunto de clases administradas que permite crear aplicaciones avanzadas y sensacionales visualmente. Windows Presentation Foundation también introduce XAML, que permite utilizar un modelo basado en XML para manipular mediante declaración el modelo de objetos de Windows Presentation Foundation.</p>
<p>Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Windows.Forms <a href="http://msdn2.microsoft.com/en-us/library/system.windows.aspx"></a>o sus descendientes. Los componentes principales son:</p>
<table border="0" width="520" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">
<h3>•</h3>
</td>
<td class="listItem">
<h6>Un modelo de aplicaci<a href="http://msdn2.microsoft.com/en-us/library/ms754032.aspx"></a>òn con compatibilidad con exploración, ventanas y cuadros de diálogo</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Enlace de datos de IU</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Un avanzado conjunto de objetos de diseño y de control extensibles</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Gráficos bidimensionales y tridimensionales</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Animaciones</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Multimedia</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Documentos</h6>
</td>
</tr>
</table>
<h2>Microsoft® Windows® Workflow Foundation</h2>
<p>Windows Workflow Foundation es una nueva plataforma de desarrollo de flujo de trabajo basada en .NET Framework.</p>
<p>Windows Workflow Foundation proporciona un modelo de programación para desarrollar y ejecutar una amplia variedad de aplicaciones de flujo de trabajo persistentes, con estado y de larga duración.</p>
<p>Windows Workflow Foundation proporciona una funcionalidad de flujo de trabajo de fábrica para desarrollar fácilmente aplicaciones basadas en flujo de trabajo como, por ejemplo, administración de documentos, flujo de páginas comerciales, administración de IT y distintas aplicaciones de línea de negocios.</p>
<p>Las aplicaciones pueden cargar el motor de flujo de trabajo y conectar una gran variedad de componentes del servicio de tiempo de ejecución. Windows Workflow Foundation es muy extensible, por lo que puede crear sus propios componentes personalizados para tratar preocupaciones empresariales concretas.</p>
<p>Windows Workflow Foundation también ofrece compatibilidad con ASP.NET para facilitar la creación y ejecución de flujos de trabajo que se ejecutan en el entorno de Internet Information Services (IIS)/ASP.NET.</p>
<h6><strong>Nota: </strong><em>El SDK de Windows<sup>®</sup>, que incluye contenido para Microsoft® .NET Framework 3.0, proporciona un conjunto de interfaces de programación de aplicaciones (API) administradas, documentación, muestras y herramientas que permiten crear una gran variedad de aplicaciones para Windows. En un nivel superior, .NET Framework 3.0 consta de estos componentes básicos.</em></h6>
<p><strong>Fuente: http://www.microsoft.com/spanish/msdn/articulos/</strong></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=15&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Integración de Windows Workflow Foundation y Windows Communication Foundation</title>
		<link>http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/</link>
		<comments>http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/#comments</comments>
		<pubDate>Sun, 23 Sep 2007 22:52:53 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/</guid>
		<description><![CDATA[Gracias a la disponibilidad de Windows Workflow Foundation (WF), Microsoft está introduciendo funciones de flujo de trabajo en la plataforma de desarrollador de .NET. Estas capacidades permiten que los desarrolladores creen flujos de trabajo que se ajusten a un amplio número de situaciones, desde sencillos flujos de trabajo secuenciales hasta complejos flujos de trabajo basados [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Gracias a la disponibilidad de Windows Workflow Foundation (WF), Microsoft está introduciendo funciones de flujo de trabajo en la plataforma de desarrollador de .NET. Estas capacidades permiten que los desarrolladores creen flujos de trabajo que se ajusten a un amplio número de situaciones, desde sencillos flujos de trabajo secuenciales hasta complejos flujos de trabajo basados en equipos con sofisticadas interacciones humanas. Al mismo tiempo, se está imponiendo una tendencia que promueve la exposición de las funciones empresariales a través de extremos de servicio encapsulados, que permiten reutilizar y componer las funciones y los procesos empresariales, lo que provoca el ascenso de las arquitecturas orientadas a servicios. Windows Communication Foundation (WCF) está disponible ya para proporcionar a los desarrolladores funciones que permitan desarrollar sistemas conectados de forma sencilla, mediante una API de desarrollador consistente, un tiempo de ejecución de alojamiento sólido y una solución flexible controlada por configuración para asistir en la implementación.</p>
<h3>Muestra de informes de gastos</h3>
<p>La muestra de código de este artículo está basada en la muestra del flujo de trabajo de informes de gastos que funciona como modelo del proceso empresarial estándar relacionado con el envío y la aprobación de una reclamación de gastos por parte del empleado. La muestra original se ha actualizado para demostrar cómo se puede aprovechar de WCF y .NET 3.0 Framework para alojar este supuesto de forma más eficaz.</p>
<p>Cuando se publicó la primera muestra de informes de gastos, se utilizó .NET Remoting para ofrecer comunicación entre las aplicaciones cliente y la aplicación host que contenía la instancia de tiempo de ejecución del flujo de trabajo.</p>
<p>Hemos refactorizado la implementación de los informes de gastos para realizar la comunicación entre clientes y servicio mediante WCF. La solución también se ha estructurado lógicamente para apartar las distintas preocupaciones dentro de ésta.</p>
<p><img border="0" width="321" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf01.gif" height="477" style="width:321px;height:391px;" /></p>
<p><em>Figura 1. Estructura de nuestra solución refactorizada</em></p>
<p>Es importante entender cómo se utilizan los mensajes dentro del contexto del proceso empresarial, de forma que pueda incorporarlos a su diseño. En el ciclo de vida de los informes de gastos, existen varios puntos de interacción. Revisémoslos brevemente:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Existen tres partes en el proceso: Un <em>cliente</em>, un <em>director</em> y el sistema <em>de host</em> de los informes de gastos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">El proceso se inicia cuando un <em>cliente</em> envía una nueva reclamación de gastos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilizamos una <em>directiva</em> de reglas para determinar si la reclamación de gastos se puede aprobar automáticamente.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Si la reclamación de gastos no se ha aprobado automáticamente, necesitamos un <em>director</em> para que apruebe el informe. El director tiene que comprobar la aprobación de un informe nuevo o recibir una notificación al respecto.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Si el director no lo aprueba dentro de un margen de <em>demora</em> flexible, el proceso rechazará automáticamente la reclamación.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Después de revisar una reclamación, el <em>cliente</em> y el <em>director</em> se deben actualizar en función del resultado.</td>
</tr>
</table>
<p>Mediante WF, podemos modelar este proceso a través de las actividades estándar que se ofrecen con el marco. Podemos utilizar <strong>DelayActivity</strong> para administrar un desencadenamiento de eventos después de que haya transcurrido un período de tiempo y podemos utilizar el motor de reglas y PolicyActivity para administrar un conjunto flexible de reglas que se interroguen en busca de un resultado.</p>
<p>Dado que se trata de un proceso orientado al usuario, debemos interactuar con los usuarios finales y volver a desencadenar la interacción en el flujo de trabajo. WF ofrece un modelo de programación completo que permite la comunicación entre un host y un flujo de trabajo a través de los servicios locales, <strong>HandleExternalEventActivity</strong> y <strong>CallExternalMethodActivity.</strong></p>
<p>Dado que esto supone un concepto importante en la creación de flujos de trabajo interactivos, analicemos rápidamente cómo se ha diseñado esto en WF.</p>
<p>Para modelar interacciones en WF, debemos diseñar un contrato que exponga un número de eventos y métodos. Tanto el proceso de host como el de flujo de trabajo comprenderán este contrato. El contrato/La interfaz que hemos creado se deben marcar con el atributo <strong>[ExternalDataExchange()]</strong>, que los identifica como diseñados para el intercambio de datos de flujo de trabajo. En nuestra muestra, utilizamos la interfaz <strong>IExpenseLocalService</strong> con nuestro flujo de trabajo.</p>
<p>A continuación, suscribimos una clase (conocida como Servicio local) que implementa dicha interfaz con el tiempo de ejecución del flujo de trabajo. Las actividades de flujo de trabajo pueden registrarse para eventos o consumir métodos definidos en el tipo de interfaz, y se transmitirán al servicio local que hemos registrado. Esto utiliza un patrón denominado Inversión de control que elimina el estrecho acoplamiento entre el flujo de trabajo y el tipo concreto de servicio local. En nuestro ejemplo, la clase <strong>ExpenseLocalService</strong> implementa nuestro contrato <strong>IExpenseLocalService.</strong></p>
<p>Si el flujo de trabajo se ejecuta primero, se puede ofrecer una bolsa inicial de datos en la que trabajar. Después de que el flujo de trabajo alcance un punto en el que necesite interacción externa, podemos desencadenar un evento que se pueda enlazar a <strong>HandleExternalEventActivity</strong> en el flujo de trabajo. Esta actividad toma el tipo de interfaz y el evento como argumentos. El flujo de trabajo se activará cuando se desencadene el evento, lo que permite que continúe la ejecución.</p>
<p>Si el flujo de trabajo debe volver a llamar a un servicio local, puede hacerlo mediante <strong>CallExternalMethodActivity</strong> y proporcionando la interfaz y el nombre de método como argumentos.</p>
<p>Gracias a estas actividades, podemos establecer una comunicación bidireccional dentro del proceso de host con un flujo de trabajo en ejecución y, a través del uso de la Inversión de control dentro de WF, se le protege del estrecho acoplamiento entre los flujos de trabajo y los servicios locales.</p>
<p>Sin embargo, y aunque son más extensas que el proceso de host, debemos permitir interacciones controladas por otros sistemas o incluso por otros usuarios. Podemos lograr este nivel de interacción distribuyendo nuestras operaciones interactivas a través de servicios a los que pueden, a su vez, llamar otros servicios o aplicaciones controladas por usuario. WCF es el marco en el que podemos crear esta función de mensajería de una manera flexible.</p>
<p>Las ventajas clave de nuestro supuesto de integración con WCF son las siguientes:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Podemos desacoplar nuestra implementación de servicio a partir del código de instalación de mensajería.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Hay mucho menos código y menos complejidad a la hora de conectar nuestros sistemas.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Tenemos flexibilidad de implementación.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Podemos utilizar las devoluciones de llamada directas desde el host a los clientes, para ofrecer actualizaciones de información más rápidas y con menos sobrecarga.</td>
</tr>
</table>
<h3>Lista de comprobación de integración</h3>
<p>Para completar una integración de WF y WCF, debemos exponer una interfaz de servicio que ofrezca varios puntos de interfaz a los consumidores, donde puedan iniciar o interactuar con un flujo de trabajo en ejecución. El servicio se debe modelar en torno a los puntos en los que el proceso empresarial interactúa con entidades externas, como usuarios implicados en el proceso.</p>
<p><img border="0" width="567" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf02.gif" height="431" style="width:473px;height:400px;" /></p>
<p><em>Figura 2. Puntos de interacción en el supuesto de informes de gastos</em></p>
<p>Para lograr esto, debemos:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Definir contratos de servicio.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Implemente operaciones de servicio que creen nuevos flujos de trabajo (o interactúen con flujos de trabajo existentes) a través de eventos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Aloje una instancia de tiempo de ejecución del flujo de trabajo dentro de un host de servicios.</td>
</tr>
</table>
<p>Además de simplemente recibir nuestro flujo de trabajo, también podemos usar los canales dúplex de WCF para desencadenar eventos fuera del flujo de trabajo y devolverlos a los clientes de consumo. En el caso de los informes de gastos, esto supone una ventaja, ya que la solución depende de que los clientes sondeen el servicio en busca de actualizaciones de datos regulares. En vez de eso, pueden recibir la notificación directamente desde el servicio.</p>
<p>Para ello, debemos:</p>
<table border="0" width="502" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Definir un contrato de devolución de llamada.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilizar un enlace que admita un canal dúplex.</td>
</tr>
</table>
<h3>Definición de contratos de servicio</h3>
<p>Windows Communication Foundation (WCF) requería que se declarara un contrato formal para definir de manera abstracta las funciones de un servicio y el intercambio de datos. Esto se define en código mediante la declaración de una interfaz.</p>
<p>Cuándo diseñe un servicio empresarial, probablemente utilizará un patrón de colaboración de solicitud y respuesta. Al utilizar este patrón, debe incluir estos tres aspectos en el contrato que se ofrece:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Las operaciones que se están publicando. </strong>Éstas son las funciones que publica el servicio para sus consumidores. Éstos son los métodos de la interfaz.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Mensajes que encapsulan los datos estructurados de cada solicitud y respuesta. </strong>Éstos son los argumentos y los tipos de valor devuelto de cada método. En la terminología de WCF, éstos son contratos de mensaje típicos o, en situaciones más sencillas, serán contratos de datos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Las definiciones de datos de las entidades empresariales principales que se pueden intercambiar a través del servicio. </strong>Éstos forman parte de los mensajes. En la terminología de WCF, éstos serán nuestros contratos de datos.</td>
</tr>
</table>
<p>Un contrato de servicio se define mediante el uso de un marcado basado en atributos que defina los contratos que exponen operaciones y, a continuación, las operaciones específicas que se están publicando a través de la red.</p>
<p>Cada contrato de servicio se marca explícitamente con el atributo [<strong>ServiceContract</strong>]. Este atributo se puede declarar con parámetros entre los que se incluyan:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Name.</strong> Controla el nombre del contrato declarado en el elemento <strong>&lt;portType&gt;</strong> de WSDL</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Namespace.</strong> Controla el nombre del contrato declarado en el elemento <strong>&lt;portType&gt;</strong> de WSDL</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>SessionMode. </strong>Especifica si el contrato requiere un enlace que admita sesiones</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>CallbackContract. </strong>Especifica el contrato que se va a utilizar para las devoluciones de llamada de clientes</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>ProtectionLevel. </strong>Especifica si el contrato requiere un enlace que admita la propiedad <strong>ProtectionLevel</strong>, que se utiliza para declarar los requisitos de cifrado y las firmas digitales</td>
</tr>
</table>
<p><strong><em>Declaración de operaciones</em></strong></p>
<p>Por tanto, el servicio está compuesto de un número de operaciones publicadas. Las operaciones explícitamente suscritas en el contrato que se está marcando con el atributo [<strong>OperationContract</strong>]. Al igual que <strong>ServiceContract</strong>, un <strong>OperationContract</strong> tiene varios parámetros que controlan cómo se puede enlazar con un extremo. Éstos incluyen:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Action.</strong> Controla el nombre que identifica esta operación de forma única. Cuando se reciben mensajes en un extremo, el distribuidor utiliza el control y la acción para determinar el método al que se va a llamar.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>IsOneWay.</strong> Indica que la operación tomará un mensaje de solicitud, pero no genera respuesta. Esto es diferente al hecho de simplemente devolver un tipo de valor <strong>void</strong> que aún generará un mensaje de resultado.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>ProtectionLevel. </strong>Especifica los requisitos de cifrado o firma que requerirá la operación.</td>
</tr>
</table>
<p>Aquí se incluye un ejemplo del aspecto de un contrato de servicio en el código.</p>
<pre>[ServiceContract]
public interface IExpenseService
{
        [OperationContract]
        GetExpenseReportsResponse GetExpenseReports(); 

        [OperationContract]
        GetExpenseReportResponse GetExpenseReport(GetExpenseReportRequest
getExpenseReportRequest);
}</pre>
<p><strong><em>Declaración de entidades de datos y mensajes</em></strong></p>
<p>Probablemente deseará modelar sus mensajes como clases que definan la carga útil o el cuerpo de cada uno de los mensajes que envíe. Esto se parece a la forma en que se modelan los mensajes mediante herramientas, como WS Contract First (WSCF), al crear servicios Web con ASP.NET.</p>
<p>WCF utiliza de forma predeterminada un motor de serialización denominado DataContractSerializer para serializar y deserializar datos (es decir, para convertirlo a y desde XML). Usamos DataContractSerializer agregando una referencia al espacio de nombres <strong>System.Runtime.Serialization</strong> y, a continuación, marcamos nuestra clase con el atributo <strong>[DataContract]</strong> y los miembros que se van a publicar con el atributo <strong>[DataMember]</strong>.</p>
<pre>[DataContract]
    public class GetExpenseReportsResponse
    {
        private List&lt;ExpenseReport&gt; reports; 

        [DataMember]
        public List&lt;ExpenseReport&gt; Reports
        {
            get { return reports; }
            set { reports = value; }
        }
    }</pre>
<p>Las entidades de datos que se utilizan dentro de los mensajes representan las entidades incluidas dentro del dominio empresarial. Al igual que los contratos de mensajes, podemos usar DataContractSerializer y los atributos para suscribir explícitamente miembros que se están distribuyendo; o, si sólo vamos a modelar datos, podemos usar un enfoque de campos públicos y marcar la clase como serializable.</p>
<p>En la muestra, hemos utilizado el enfoque de contrato de datos para marcar la mensajería. En situaciones reales, a menudo tendrá que tratar con esquemas más complicados, el uso de atributos en los esquemas y los requisitos para utilizar encabezados de SOAP. WCF se encarga de estos casos extremos gracias a la capacidad de definición de clases marcadas con el atributo [<strong>MessageContract</strong>], que describe todo el sobre de SOAP, en vez de sólo el cuerpo.</p>
<h3>Alojamiento del tiempo de ejecución del flujo de trabajo</h3>
<p>Los servicios suelen tener en cuenta cualquier comportamiento simultáneo en el que se cree una instancia nueva del tipo de servicio y se mantenga durante el ciclo de vida de una sesión. Para usar el flujo de trabajo en esta situación, debemos crear una instancia de tiempo de ejecución del flujo de trabajo y mantenerla durante el ciclo de vida de la instancia de host de servicios, en vez de hacerlo por llamada.</p>
<p>El enfoque recomendado es utilizar una clase de extensión que se activará tras la creación del host de servicios. Esta extensión creará y mantendrá una instancia global del tiempo de ejecución del flujo de trabajo, permitiendo el acceso por cada una de las instancias de servicio independientes.</p>
<p>Para implementar una extensión en <strong>ServiceHost</strong>, cree una clase que implemente <strong>IExtension&lt;ServiceHostBase.&gt;</strong> En la solución, puede encontrar un ejemplo de esto en la clase <strong>WfWcfExtension</strong> que reside en el proyecto de código <strong>WcfExtensions.</strong></p>
<p>Es necesario implementar dos métodos: <strong>Attach</strong>, que se denominará como la extensión adjunta a su objeto principal y <strong>Detach</strong>, que se denominará como el objeto principal que se está descargando.</p>
<p>El método <strong>Attach</strong>, que se muestra aquí, crea una instancia nueva de <strong>WorkflowRuntime</strong> y la instancia con los servicios necesarios. Almacenaremos esto en un campo privado local denominado <strong>workflowRuntime.</strong></p>
<pre>void IExtension&lt;ServiceHostBase&gt;.Attach(ServiceHostBase owner)
{
   workflowRuntime = new WorkflowRuntime(workflowServicesConfig);
   ExternalDataExchangeService exSvc = new ExternalDataExchangeService();
   workflowRuntime.AddService(exSvc);
   workflowRuntime.StartRuntime();
}</pre>
<p>Como puede ver, nuestra inicialización del tiempo de ejecución del flujo de trabajo implica también la adición de instancias de servicio al tiempo de ejecución, antes de iniciarlo. Al crear sus soluciones, generalmente recomendamos agregar cualquier servicio antes de iniciar el tiempo de ejecución. Sin embargo, si el acoplamiento es una preocupación, podría ser más sensato utilizar un enfoque de enlace en tiempo de ejecución.</p>
<p>En nuestro ejemplo, como parte del método <strong>SetUpWorkflowEnvironment</strong> de la clase <strong>ExpenseService</strong>, agregamos una instancia de <strong>ExpenseLocalService</strong> en <strong>ExternalDataExchangeService</strong> después de que se haya iniciado <strong>WorkflowRuntime</strong>.</p>
<p>El método <strong>Detach</strong> que se muestra aquí desconecta el tiempo de ejecución llamando a <strong>StopRuntime.</strong></p>
<pre>void IExtension&lt;ServiceHostBase&gt;.Detach(ServiceHostBase owner)
{
   workflowRuntime.StopRuntime();
}</pre>
<p>Dado que <strong>WorkflowRuntime</strong> se crea e inicializa como parte del inicio del host de servicios, cualquier flujo de trabajo existente podrá continuar antes de realizar las llamadas de servicio. Si termina el host de servicios termina, el tiempo de ejecución del flujo de trabajo se desconectará limpiamente.</p>
<p class="alertType"><img border="0" width="10" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/note.gif" height="10" /> <strong>Nota:</strong></p>
<p><strong>Recomendamos que utilice la persistencia de flujo de trabajo (por ejemplo, </strong><strong>SqlWorkflowPersistenceService) al alojar flujos de trabajo y modelar flujos de trabajo de ejecución prolongada, que es la norma habitual. Esto le ofrecerá un mecanismo de persistencia de estado para sobrevivir a cualquier reinicio de la aplicación o de procesos.</strong></p>
<p><strong><em>Creación de operaciones de servicio</em></strong></p>
<p>Para crear una clase que contenga el comportamiento de servicio, debe implementar una o más interfaces que definan un contrato de servicio.</p>
<pre>public class ExpenseService :
        IExpenseService,
        IExpenseServiceClient,
        IExpenseServiceManager</pre>
<p>Para integrar con el flujo de trabajo, nuestros métodos de servicio no contendrán lógica empresarial, sino que en su lugar contendrán código para controlar o desencadenar eventos en un flujo de trabajo en ejecución que encapsule el proceso empresarial.</p>
<p>Para las operaciones que tratan con el flujo de trabajo, iniciaremos un nuevo flujo de trabajo o interactuaremos con un flujo de trabajo ya en ejecución.</p>
<p>La creación de una instancia de flujo de trabajo nueva requiere que utilicemos <strong>WorkflowRuntime</strong> para crear una instancia nueva del tipo de flujo de trabajo deseado. Ya hemos creado una en nuestra clase de extensión <strong>ServiceHost.</strong> Para obtener una referencia a esta instancia, debemos encontrar nuestra extensión personalizada con <strong>OperationContext.</strong></p>
<pre>WfWcfExtension extension =
OperationContext.Current.Host.Extensions.Find&lt;WfWcfExtension&gt;();
workflowRuntime = extension.WorkflowRuntime;</pre>
<p><strong>OperationContext</strong> es una clase que nos ofrece acceso al contexto de ejecución del método de servicio. Como puede ver en el código anterior, ofrece un valor Singleton denominado <strong>Current</strong> que nos facilita el contexto del método de servicio actual. Llamamos a la propiedad <strong>Host</strong> para capturar de nuevo una instancia en el <strong>ServiceHost</strong> que se está ejecutando y, a continuación, encontramos nuestra extensión en función de su tipo.</p>
<p>Después de que tengamos una referencia a nuestra instancia de extensión, podemos volver a <strong>WorkflowRuntime</strong> a través de nuestra propiedad pública y utilizarla para crear una instancia nueva de nuestro <strong>SequentialWorkflow.</strong></p>
<pre>Guid workflowInstanceId =
submitExpenseReportRequest.Report.ExpenseReportId; 

Assembly asm = Assembly.Load("ExpenseWorkflows");
Type workflowType = asm.GetType("ExpenseWorkflows.SequentialWorkflow"); 

WorkflowInstance workflowInstance =
   workflowRuntime.CreateWorkflow(workflowType, null, workflowInstanceId);
workflowInstance.Start(); 

expenseLocalService.RaiseExpenseReportSubmittedEvent(
   workflowInstanceId, submitExpenseReportRequest.Report);</pre>
<p>En el código anterior, creamos una instancia de flujo de trabajo nueva basada en un tipo predefinido. Si bien esto se podía lograr a través de la instancia de tipo directo, esto demuestra que en realidad podríamos tener flexibilidad para crear un flujo de trabajo basado en una regla dinámica en el tiempo de ejecución, en vez de hacerlo a través de un enlace con tipos más sólidos.</p>
<p>La última línea señala el inicio del flujo de trabajo mediante el desencadenamiento de un evento manejado por el primer <strong>HandleExternalEventActivity</strong> del flujo de trabajo. Esto se desencadena a través de una instancia de la clase <strong>ExpenseLocalService.</strong> En la muestra, <strong>ExpenseLocalService</strong> se utiliza para interactuar con el flujo de trabajo a través del inicio de nuevos flujos de trabajo o el desencadenamiento de eventos en flujos de trabajo existentes. Utilizamos esta clase como mecanismo de encapsulación de nuestro proceso empresarial. Internamente, esto se implementa con WF.</p>
<p><img border="0" width="470" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf03.gif" height="442" style="width:386px;height:382px;" /></p>
<p><em>Figura 3. Nuestro flujo de trabajo se inicia con HandleExternalEventActivity.</em></p>
<p>El otro tipo de situación con la que trataremos es llamar de nuevo a un flujo de trabajo existente y desencadenar eventos. Debemos desencadenar un evento en el motor de flujo de trabajo que provoque que nuestro flujo de trabajo existente reciba el evento y continúe el procesamiento.</p>
<p>Un ejemplo de dónde se producirá esto dentro del flujo de informes de gastos se produce cuando se necesita al Director de aprobación. El flujo de trabajo llama al método externo para <strong>RequestManagerApproval</strong> que desencadenará una alerta para el director acerca de que deben aprobar o rechazar un nuevo informe de gastos.</p>
<p>El flujo de trabajo contiene <strong>ListenActivity</strong>, que se bloqueará hasta que se haya producido uno de los eventos posibles. En este caso, recibimos un evento que indica que un director ha revisado el informe o que ha transcurrido nuestro tiempo de espera en función de <strong>DelayActivity.</strong></p>
<p><img border="0" width="556" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf04.gif" height="518" style="width:453px;height:501px;" /></p>
<p><em>Figura 4. Flujo de actividad personalizado de ManagerApproval</em></p>
<pre>Guid workflowInstanceId =
submitReviewedExpenseReportRequest.Report.ExpenseReportId; 

ExpenseReportReviewedEventArgs e =
   new ExpenseReportReviewedEventArgs(workflowInstanceId, report, review); 

if (ExpenseReportReviewed != null)
{
   ExpenseReportReviewed(null, e);
}</pre>
<p>Cuando un director revisa un informe con <em>ManagerApplication</em>, se vuelve a realizar una llamada de servicio al host solicitando el método <strong>SubmitReviewedExpenseReport</strong> que desencadena el evento <strong>ExpenseReportReviewed.</strong></p>
<p>Al desencadenar un evento <strong>HandleExternalEventActivity</strong> en el flujo de trabajo, debe conocer el GUID de la instancia del flujo de trabajo con que tratamos, para que el evento se pueda dirigir.</p>
<p>Cada evento se desencadena con <strong>EventArgs</strong>, que permite volver a transferir datos al flujo de trabajo a través del modelo de eventos. En este caso, podemos transferir detalles del estado actual del informe y los datos que nos dan contexto acerca de la actividad de revisión.</p>
<p>En el flujo de trabajo, los eventos se transmiten automáticamente al flujo de trabajo a través de las propiedades en <strong>HandleExternalEventActivity.</strong></p>
<p><img border="0" width="587" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf05.gif" height="353" style="width:485px;height:352px;" /></p>
<p><em>Figura 5. Estamos transmitiendo HandleExternalEventActivity a la interfaz de IExpenseLocalService.</em></p>
<p>Especifique el tipo de interfaz que se debe marcar con el atributo [<strong>ExternalDataExchange</strong>] y, a continuación, el evento de esa interfaz al que se va a suscribir <strong>HandleExternalEventActivity</strong>.</p>
<p>Los argumentos del evento se deben derivar desde la clase <strong>ExternalDataEventArgs.</strong> Como mínimo, esto significa que cada evento contendrá el contexto, al igual que el valor <strong>InstanceId</strong> del flujo de trabajo. El tiempo de ejecución del flujo de trabajo administra el enrutamiento del evento a la instancia de flujo de trabajo correcta con el fin de continuarlo. Si utilizamos un servicio de persistencia, el tiempo de ejecución también administrará la hidratación y la rehidratación de cualquier estado de ejecución del flujo de trabajo durante el transcurso de su ejecución.</p>
<p><strong><em>Alojamiento del servicio</em></strong></p>
<p>Para alojar un servicio de WCF, debemos ejecutarlo dentro del contenedor <strong>ServiceHost.</strong></p>
<p>Para revisar cómo se puede lograr el alojamiento con WCF, permítanos recordar las alternativas que tenemos disponibles:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Para procesos estándar de Windows, se puede crear y abrir manualmente una instancia de <strong>ServiceHost</strong>.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Al alojar un extremo web (servicio web) a través de Microsoft Internet Information Services (IIS) 6.0, usamos un HttpHandler personalizado facilitado bajo el espacio de nombres <strong>System.ServiceModel.</strong></td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Al alojar bajo IIS 7, podemos utilizar Windows Activation Service (WAS) para alojar nuestros extremos.</td>
</tr>
</table>
<p>Generalmente, si está creando servicios web, le conviene elegir el alojamiento mediante Internet Information Services. Si está creando un extremo de instancia única que funcione como demonio, generalmente le conviene elegir el alojamiento a través de un servicio de Windows.</p>
<p>En nuestro ejemplo, estamos alojando la instancia de servicio principal dentro de una aplicación de consola de Windows de forma parecida a cómo se alojaría un servicio de Windows.</p>
<p>Para implementar un servicio, debemos crear una instancia de la clase <strong>ServiceHost</strong> y abrir sus extremos para cada tipo de servicio que queramos publicar. <strong>ServiceHost</strong> toma varios argumentos como parte de su constructor; sin embargo, el argumento principal es un argumento <strong>Type</strong> o una instancia de una clase que implementa <strong>ServiceContract.</strong></p>
<table border="0" width="401" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilice <strong>Type</strong> cuando desee utilizar <strong>PerCall</strong> o instancias de <strong>PerSession.</strong></td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilice una instancia única cuando utilice instancias de <strong>Single</strong>.</td>
</tr>
</table>
<p>Después de haber establecido un host, analizará sintácticamente cualquier configuración disponible y la fusionará con cualquier configuración agregada explícitamente, con el fin de determinar los extremos disponibles y abrirlos para publicar. A medida que se reciben llamadas de clientes, las solicitudes se procesan en nuevos subprocesos de trabajo en segundo plano y se dirigen a las operaciones de servicio apropiadas, según les indica el nombre de contrato de SOAP y la acción del mensaje.</p>
<pre>using (ServiceHost serviceHost = new ServiceHost(new ExpenseService()))
{
   WfWcfExtension wfWcfExtension =
      new WfWcfExtension("WorkflowRuntimeConfig");
   serviceHost.Extensions.Add(wfWcfExtension);
   serviceHost.Open(); 

   // block the process at this point, for example Console.ReadLine(); 

   serviceHost.Close();
}</pre>
<p>Al configurar <strong>ServiceHost</strong>, debe hacerlo así antes de abrir los extremos para las conexiones. Puede hacerlo así, como le hemos mostrado anteriormente, interactuando con el objeto de host antes de llamar a <strong>.Open().</strong> Es recomendable que utilice un ámbito de uso para que <strong>ServiceHost</strong> esté dispuesto antes del uso y que llame explícitamente a <strong>Close()</strong> al final de ese ámbito para desconectar limpiamente cualquier extremo o conexión activos.</p>
<h3>Configuración de implementación</h3>
<p>WCF ofrece un mecanismo para separar las preocupaciones de implementación de la implementación en sí mediante la configuración de los extremos a través de la configuración XML. Esto ofrece a los administradores la capacidad de modificar la directiva de un servicio sin tener que perfeccionar el código.</p>
<p>Cada servicio se publica en uno o más extremos. Un extremo es simplemente un punto de conexión dirigible en el que los clientes pueden consumir el servicio. En WCF, cada extremo se declara con tres atributos que se han popularizado como los ABC de WCF.</p>
<p>Son <strong>Address</strong>, <strong>Binding</strong> y <strong>Contract</strong>.</p>
<p><strong>Address:</strong> La ubicación dirigible única de este extremo. Generalmente, será un URI que le proporciona la dirección absoluta en la que el servicio está escuchando solicitudes; por ejemplo: <em>http://myhost/myservice</em> o <em>net.tcp://myhost:400/myservice</em></p>
<p><strong>Binding:</strong> La directiva que dicta el protocolo para la comunicación entre el servicio y sus consumidores. Binding especifica aspectos tales como el tipo del transporte que se está utilizando, la forma en que se están codificando los mensajes y la forma en que se serializan los datos. WCF incluye varios valores Binding &#8220;de fábrica&#8221; que admiten la mayoría de las situaciones comunes.</p>
<p><strong>Contract:</strong> Las operaciones y los datos que se van a publicar según hayamos definido a través de una interfaz en el código.</p>
<p>Para configurar nuestro servicio, debemos declarar una configuración que declare nuestro servicio y configurar cualquier número de extremos para el servicio. Dado que un servicio podría implementar cualquier número de contratos, esto afectará también al número de extremos que tenga que publicar.</p>
<p>A continuación le mostramos una configuración de ejemplo.</p>
<pre>&lt;services&gt;
   &lt;service name="ExpenseServices.ExpenseService"&gt;
      &lt;endpoint
         address="http://localhost:8081/ExpenseService/Manager"
         binding="wsHttpBinding"
         contract="ExpenseContracts.IExpenseServiceManager" /&gt;
&lt;endpoint
         address="http://localhost:8081/ExpenseService/Client"
         binding="wsDualHttpBinding"
         contract="ExpenseContracts.IExpenseServiceClient" /&gt;
   &lt;/service&gt;
&lt;/services&gt;</pre>
<p>En este ejemplo de configuración, declaramos una configuración para el servicio de tipo <strong>ExpenseServices ExpenseService</strong>. Esto permite que el tiempo de ejecución encuentre la configuración cuando creamos una instancia de un nuevo <strong>ServiceHost</strong> basado en este tipo.</p>
<h3>Consumo de servicios</h3>
<p>El consumo de servicios a través de WCF se realiza con la clase <strong>ChannelFactory.</strong><strong>ChannelFactory</strong> utiliza el patrón de fábrica para ofrecernos instancias proxy de un contrato de servicio que se conecta con el extremo especificado en la configuración. Podemos configurar la fábrica con información de tiempo de ejecución, como credenciales de seguridad y certificados para cifrado de mensajes, o para determinar la información del extremo dinámicamente.</p>
<pre>private IExpenseServiceManager CreateChannelExpenseServiceManager()
{
   ChannelFactory&lt;IExpenseServiceManager&gt; factory = new
ChannelFactory&lt;IExpenseServiceManager&gt;("ExpenseServiceManager");
   IExpenseServiceManager proxy = factory.CreateChannel(); 

   return proxy;
}</pre>
<p>Como puede ver, inicialmente creamos una instancia de la fábrica, que utiliza un argumento genérico para que el contrato de servicio nos permita construir una fábrica más precisa que devolverá sólo instancias del contrato deseado. También especificamos un argumento que determine la configuración que se utilizará para el extremo. En este caso, estamos utilizando una configuración de extremo denominada <em>ExpenseServiceManager</em>, que se refiere a la configuración que tenemos en nuestro archivo de configuración de la aplicación.</p>
<pre>&lt;system.serviceModel&gt;
   &lt;client&gt;
         &lt;endpoint name="ExpenseServiceManager"
            address="http://localhost:8081/ExpenseService/Manager"
            binding="wsHttpBinding"
            contract="ExpenseContracts.IExpenseServiceManager" /&gt;
   &lt;/client&gt;
&lt;/system.serviceModel&gt;</pre>
<p>Puede comprobar que la definición del extremo coincide exactamente con la definición que se declara en la configuración del host. Generalmente, la única vez que tendrá una configuración diferente será cuando la dirección del cliente sea diferente a la del servidor debido a que se está implementando una configuración de red o un comportamiento personalizado.</p>
<p>Si ha instalado Windows SDK, podrá disponer de una herramienta (<em>svcutil</em>) con el fin de automatizar la creación de una configuración de extremos y clases proxy, que podrá integrar en su solución. El servicio de destino debe publicar una descripción de sus metadatos a través de WSDL o WS-Metadataexchange para poder utilizar esta herramienta</p>
<h3>Configuración de canales dúplex</h3>
<p>Hasta ahora, hemos supuesto que nuestro flujo de comunicación utilizará un patrón de colaboración de solicitud y respuesta, donde los mensajes los envía un consumidor y los responde un servicio. WCF admite varios flujos de mensajes alternativos, como la comunicación dúplex de un solo sentido (&#8221;Fire and Forget&#8221;) o bidireccional. Si tratamos con un flujo de mensajes en el que cualquier parte puede iniciar una conversación, tendremos que utilizar un dúplex o un canal bidireccional. Los canales dúplex pueden resultar muy efectivos para sistemas conectados de forma más sólida en los que se puedan enviar datos desde cualquier dirección. Un ejemplo de dónde le podría resultar esto útil es a la hora proporcionar devoluciones de llamada desde eventos.</p>
<p><strong><em>Implementación de devoluciones de llamada de clientes</em></strong></p>
<p>Las devoluciones de llamada de clientes se implementan en WCF a través de un concepto denominado <em>CallbackContracts.</em> Para el contrato que publiquemos, podemos nombrar un segundo contrato para definir las operaciones que los clientes publicarán y cuyas llamadas se puedan devolver a través de la ejecución de código en el servicio.</p>
<p>Para declarar <strong>CallbackContract</strong>, especifique el tipo de interfaz como parte del contrato de servicio desde el que se estará devolviendo la llamada.</p>
<pre>[ServiceContract(CallbackContract =
typeof(IExpenseServiceClientCallback))]</pre>
<p>También es necesario usar un enlace que admita canales dúplex, como <strong>netTcpBinding</strong> o <strong>wsDualHttpBinding.</strong> El dúplex sobre TCP se logra mediante una conexión bidireccional que se establece y mantiene en todo el intercambio de mensajes. Sobre HTTP, esto se logra mediante una devolución de llamada a una escucha de cliente. Dado que puede que el cliente no sea consciente de su ruta de regreso o que desee definir esto de forma más sólida a través de una configuración, podemos utilizar una configuración de enlace personalizada para declarar una dirección <strong>clientBaseAddress</strong> alternativa.</p>
<pre>&lt;endpoint binding="wsDualHttpBinding"
bindingConfiguration="AlternativeClientCallback"/&gt;
&lt;bindings&gt;
   &lt;wsDualHttpBinding&gt;
      &lt;binding name="AlternativeClientCallback"
clientBaseAddress="http://localhost:8082/ExpenseService/ClientCallback"/&gt;
   &lt;/wsDualHttpBinding&gt;
&lt;/bindings&gt;</pre>
<p><strong><em>Implementación de devoluciones de llamada en el cliente</em></strong></p>
<p>Implementar un contrato de devolución de llamada es exactamente lo mismo que implementar un contrato de servicio. Debemos proporcionar una implementación de la interfaz que hemos definido.</p>
<pre>class CallbackHandler : IExpenseServiceClientCallback
{
   public void ExpenseReportReviewed(
ExpenseReportReviewedRequest expenseReportReviewedRequest)
        {
            // We implement client logic to respond to the callback here.
        }
}</pre>
<p>Para permitir que el host tenga una instancia de nuestra clase <strong>CallbackHandler</strong> en la que devolver la llamada, debemos configurar nuestro canal de cliente de tal manera que sea consciente de la naturaleza dúplex de la conexión.</p>
<p>Antes de nada, como hemos descrito anteriormente, utilizaremos un enlace que admita canales dúplex. En segundo lugar, cuando inicialicemos nuestra conexión con el extremo de servicio, utilizaremos una versión subclasificada de <strong>ChannelFactory</strong>, denominada <strong>DuplexChannelFactory</strong>, que creará automáticamente una conexión dúplex para el servicio.</p>
<pre>private IExpenseServiceClient CreateChannelExpenseServiceClient()
{
   InstanceContext context = new InstanceContext(new CallbackHandler()); 

   DuplexChannelFactory&lt;IExpenseServiceClient&gt; factory =
new DuplexChannelFactory&lt;IExpenseServiceClient&gt;(context,
"ExpenseServiceClient");
   IExpenseServiceClient proxy = factory.CreateChannel(); 

   return proxy;
}</pre>
<p>La diferencia clave al usar <strong>DuplexChannelFactory</strong> es que inicializamos una instancia de nuestra clase <strong>CallbackHandler</strong> y la transferimos al constructor para que la fábrica inicialice un contexto que se utilice en las devoluciones de llamada.</p>
<p><strong><em>Implementación de devoluciones de llamada desde el host</em></strong></p>
<p>Desde la perspectiva del host, podemos obtener una referencia para devolver la llamada a nuestro cliente a través del canal de devolución de llamada que se define en nuestro contrato <strong>IExpenseServiceClient.</strong></p>
<pre>[ServiceContract(CallbackContract =
typeof(IExpenseServiceClientCallback))]
public interface IExpenseServiceClient : IExpenseService</pre>
<p>El atributo <strong>CallbackContract</strong> declara la interfaz que define el contrato para las devoluciones de llamada realizadas desde el host.</p>
<p>Para realizar la devolución de llamada, obtenemos una referencia al contrato de devolución de llamada llamando a <strong>OperationContext.Current.GetCallbackChannel</strong>, como se muestra aquí.</p>
<pre>IExpenseServiceClientCallback callback =
                   OperationContext.Current.GetCallbackChannel
&lt;IExpenseServiceClientCallback&gt;();
callback.ExpenseReportReviewed(new
ExpenseReportReviewedRequest(e.Report));</pre>
<p>Después de que tengamos una referencia a nuestro canal de devolución de llamada, podemos llamarlo con normalidad.</p>
<p>A continuación nuestro amigo Jeremy Boyd nos da algunas instrucciones que debemos recordar al diseñar los servicios:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Debe incluir flujos de trabajo de larga ejecución a través del uso de un servicio de persistencia.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Una operación de servicio puede interactuar a través de un flujo de trabajo en ejecución, a través del desencadenamiento de eventos. Los flujos de trabajo se deben diseñar para desencadenar eventos cuando se exija atención y responder a eventos cuando se esté interactuando externamente (por ejemplo, desde un servicio o un usuario externos).</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Los flujos de trabajo se ejecutarán asincrónicamente con respecto a la llamada de servicio; por tanto, realice un diseño apropiado cuando piense en la devolución de datos desde el servicio o en qué estado se podrían encontrar los datos en ese momento. Si desea utilizar un enfoque sincrónico, puede utilizar la clase <strong>ManualWorkflowSchedulerService</strong> para permitir una programación manual de la ejecución de flujos de trabajo.</td>
</tr>
</table>
<p><em><strong>Fuente: http://www.microsoft.com/spanish/msdn/articulos/</strong></em></p>
<p><strong>Publicado por: </strong>Jeremy Boyd, consultor experto técnico de Intergen, proveedor de soluciones de Nueva Zelanda y Partner Gold Certified de Microsoft, así como Director regional de MSDN en la comunidad de Nueva Zelanda.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=14&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf01.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf02.gif" medium="image" />

		<media:content url="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/note.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf03.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf04.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf05.gif" medium="image" />
	</item>
		<item>
		<title>Desarrollo de programas de .NET sin Visual Studio!!!!</title>
		<link>http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/</link>
		<comments>http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/#comments</comments>
		<pubDate>Thu, 20 Sep 2007 20:20:03 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/</guid>
		<description><![CDATA[La forma más fácil y productiva de desarrollar software para la plataforma Microsoft .NET® es sin duda con ayuda de Visual Studio .NET®. En realidad, recomiendo que los interesados se suscriban a &#8220;MSDN Professional&#8221;. Es un poco más cara que Visual Studio únicamente, pero incluye mucho software adicional, como todos los sistemas operativos de Microsoft, [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>La forma más fácil y productiva de desarrollar software para la plataforma Microsoft .NET® es sin duda con ayuda de Visual Studio .NET®. En realidad, recomiendo que los interesados se suscriban a &#8220;MSDN Professional&#8221;. Es un poco más cara que Visual Studio únicamente, pero incluye mucho software adicional, como todos los sistemas operativos de Microsoft, SDKs, DDKs y una &#8220;base de conocimiento&#8221;, además de un año de actualizaciones.A pesar de todas las ventajas que presenta Visual Studio, es posible desarrollar para la plataforma .NET sin él. Para ello, debe obtener el &#8220;SDK de .NET Framework&#8221;, que puede descargar de <a href="http://msdn.microsoft.com/downloads/default.asp">http://msdn.microsoft.com/downloads/default.asp</a>. El tamaño total es de más de 130 MB y está disponible tanto en un único archivo como en varios archivos separados.</p>
<p>Observe que NO se trata del runtime de .NET Framework. El runtime se conoce como &#8220;.NET Framework redistribuible&#8221;, tiene aproximadamente 20 MB y estará disponible en breve en otros idiomas además del inglés.</p>
<p>El SDK incluye el runtime, varias herramientas de desarrollo y documentación. Permite la creación de cualquier tipo de aplicación: consola, DLLs, Windows, ASP.NET y servicios de Web. Está claro que tendremos que programar como se hacía hace muchos años, creando los programas en un editor de textos como Notepad y utilizando herramientas de línea de comandos.</p>
<p>Veamos cómo crear algunos tipos de aplicaciones utilizando el lenguaje C# y el &#8220;SDK de .NET Framework&#8221;. Partimos del principio de que usted ha descargado e instalado el SDK. Los ejemplos de este artículo fueron probados en una instalación nueva de Windows XP, agregando únicamente las actualizaciones indicadas en el sitio &#8220;Windows Update&#8221; y en el SDK de Framework.</p>
<h3>Aplicación en modo de consola.</h3>
<p>Se trata del tipo más fácil de desarrollar. Escriba el programa siguiente en Notepad y guárdelo con el nombre &#8220;HolaConsola.cs&#8221;:</p>
<pre>using System; 

class Hola {
  public static void Main() {
    Console.WriteLine("Hola mundo, desde la consola");
  }
}</pre>
<p>El programa &#8220;CSC.EXE&#8221; es el compilador de línea de comandos de C#. Toma uno o varios archivos &#8220;cs&#8221; y los compila para crear archivos .EXE o .DLL.</p>
<h3>Aplicaciones de Web.</h3>
<p>Podemos crear aplicaciones de ASP.NET de una forma muy parecida al ASP tradicional, donde sólo teníamos un archivo que combinaba el código HTML con código del lenguaje de programación.</p>
<p>Para crear una aplicación de Web de esta forma, basta con crear archivos &#8220;aspx&#8221; en el directorio del servidor de Web, normalmente c:\Inetpub\wwwroot. Como ejemplo, cree un archivo con el nombre &#8220;HolaSencillo.aspx&#8221; .</p>
<pre></pre>
<h3>Hola desde una página ASP.NET sencilla</h3>
<p>rn&#8221;);<br />
Response.Write(&#8221;Hola mundo!&#8221;);<br />
Response.Write(&#8221;rn&#8221;);<br />
}<br />
%&gt;Observe lo siguiente:</p>
<ul>
<li>La primera línea indica el lenguaje utilizado.</li>
<li>Al igual que en el ASP tradicional, el código puede ser situado entre &#8220;&#8221;.</li>
<li>Estamos usando el lenguaje C#, lo que permite una programación mucho más avanzada que con el ASP tradicional. Podríamos usar cualquier lenguaje disponible para la plataforma .NET.</li>
<li>El programa se compilará automáticamente cuando se llame a la página por primera vez.</li>
</ul>
<p>Puede probar el proyecto anterior abriendo el navegador y navegando hasta el URL &#8220;http://localhost/HolaSencillo.aspx&#8221;:</p>
<p>Al programar de esta forma, usted pierde las facilidades que ofrece una herramienta de tipo RAD, pero puede beneficiarse de algunas ventajas exclusivas de la plataforma .NET, como los controles que se ejecutan en el servidor. Los controles que se ejecutan en el servidor suponen varias ventajas:</p>
<ul>
<li>Procesan las entradas del navegador: no es necesario usar la propiedad Request.</li>
<li>Generan una salida a partir de sus propiedades: podemos generar una salida con sólo alterar las propiedades y haciendo llamadas a métodos, sin usar el objeto Response.</li>
<li>Conservan su estado cuando la página recibe un PostBack (cuando la página se llama a sí misma).</li>
</ul>
<p>Veamos como ejemplo una calculadora que usa controles del servidor, creada en el archivo CalcComps.aspx:</p>
<pre>
<form method="post">

0 

0
</form>

private void Button1_Click(object sender, System.EventArgs e)
{
  double N1 = Convert.ToDouble(TextBox1.Text);
  double N2 = Convert.ToDouble(TextBox2.Text);
  double R = N1 + N2;
  ListBox1.Items.Add(R.ToString());
} 

override protected void OnInit(EventArgs e) {
  Button1.Click += new System.EventHandler(Button1_Click);
  base.OnInit(e);
}</pre>
<p>Veamos el resultado del programa:</p>
<p>Observe lo siguiente:</p>
<ul>
<li>La página contiene varios componentes con el atributo &#8220;runat=server&#8221;. Esto significa que se creará en el servidor una instancia del componente correspondiente, cada vez que se llame a la página.</li>
<li>Los componentes procesan la entrada, generan la salida y conservan su estado. Observe que los componentes TextBox y ListBox conservan sus contenidos sin que tengamos que hacer nada.</li>
<li>El código se encuentra dentro de un bloque SCRIPT.</li>
<li>La llamada al método OnInit se realiza con la carga inicial de la página. En él, se asocia el evento Click del botón al código que procesará el evento.</li>
<li>Los valores de los campos se obtienen en las propiedades de los componentes, en lugar del objeto Request.</li>
<li>La salida se genera indirectamente. En primer lugar alteramos las propiedades de los componentes, que a su vez crean una página HTML, acorde con el navegador utilizado remotamente.</li>
</ul>
<h3>WebServices.</h3>
<p>Para desarrollar un servicio de Web sin Visual Studio .NET, sólo es necesario crear un archivo con la extensión &#8220;asmx&#8221; en el directorio del servidor de Web, normalmente c:\Inetpub\wwwroot. Cree un archivo con el nombre &#8220;MiServicio.asmx&#8221; y escriba el código siguiente:</p>
<pre>

using System.Web.Services; 

[WebService(Namespace="http://picaplan.com.br/webservices/")]
public class Cuentas: System.Web.Services.WebService {
  [WebMethod]
  public double Suma(double A, double B) {
    return A + B;
  }
  [WebMethod]
  public double Producto(double A, double B) {
    return A * B;
  }
}</pre>
<p>Puede llamar al servicio de Web desde un navegador de Web. En este caso, se crea automáticamente una página de prueba.</p>
<p>También se crea automáticamente una página con la descripción del servicio, con el estándar WDSL.</p>
<p>Observe lo siguiente:</p>
<ul>
<li>La primera línea indica que la página es un servicio de Web y que el lenguaje utilizado es C#.</li>
<li>La clase Cuentas contendrá los métodos a los que se llamará de forma remota.</li>
<li>La clase Cuentas se deriva de System.Web.Services.WebService. Esto no es imprescindible, pero resulta útil si necesita tener acceso a las variables de sesión, los encabezados de HTTP y otras características del protocolo SOAP.</li>
<li>El atributo &#8220;Namespace&#8221; no es absolutamente imprescindible para que funcione el servicio de Web, pero la norma incluye el requisito de asignar un nombre exclusivo al servicio de Web, basado normalmente en un URL al que usted tenga acceso.</li>
<li>El atributo &#8220;WebMethod&#8221; es imprescindible e indica que es posible llamar al método a través de SOAP.</li>
<li>Los tipos entregados y devueltos por los métodos deben ser &#8220;serializables&#8221;. Los tipos numéricos, string, struct y arrays son serializables. Hay otras clases de la biblioteca, por ejemplo DataSet, que también son serializables.</li>
</ul>
<h3>Llamadas a servicios de Web.</h3>
<p>La forma más fácil de llamar a un servicio de Web es crear una clase Proxy que funciona exactamente como una clase de .NET, pero que es capaz de llamar al servicio de Web. Esto puede hacerse con la utilidad WSDL.EXE. El comando que permite generar una clase capaz de llamar al servicio de Web anterior sería el siguiente:</p>
<pre>C:&gt;wsdl http://localhost/MiServicio.asmx</pre>
<p>Este comando crea un archivo con el mismo nombre que la clase que implementa el servicio de Web, &#8220;Cuentas.cs&#8221; en nuestro caso.</p>
<p>Llamaremos al servicio de Web de la aplicación siguiente en modo de consola, en el archivo &#8220;LlamarCuentas.cs&#8221;:</p>
<pre>using System; 

class Hola {
  public static void Main() {
    Cuentas C = new Cuentas();
    double R = C.Suma(10, 30);
    Console.WriteLine(R);
  }
}</pre>
<p>La aplicación anterior debe ser compilada con el comando siguiente, para unir los dos archivos fuente en el mismo ejecutable y generar el ejecutable LlamarCuentas.EXE:</p>
<pre>C:&gt;csc LlamarCuentas.cs Cuentas.cs</pre>
<pre></pre>
<pre></pre>
<pre><strong>Fuente:</strong></pre>
<pre><strong>http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art58.asp </strong></pre>
<pre>Escrito por Mauro Sant'Anna (<a href="mailto:mailto:mas_mauro@hotmail.com">mas_mauro@hotmail.com</a>). Mauro es Director regional de MSDN,</pre>
<pre>consultor e instructor de MAS Informática (<a href="http://www.mas.com.br/">www.mas.com.br</a>).</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&blog=316457&post=4&subd=cvalera&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/cvalera-128.jpg" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Windows Communication Foundation (WCF)</title>
		<link>http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/</link>
		<comments>http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/#comments</comments>
		<pubDate>Thu, 20 Sep 2007 19:58:29 +0000</pubDate>
		<dc:creator>Carlos J. Valera A.</dc:creator>
		
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/</guid>
		<description><![CDATA[Guao!!!!
La tecnología aumenta cada vez más rápido y así mismo lo que las hace funcionar, tal es el caso de algo no tan nuevo pero que últimamente a dado que hablar tiene que ver con el .Net Framework y mas específicamente sobre WCF:
Windows Communication Foundation (WCF) es la plataforma de última generación de Microsoft diseñada [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Guao!!!!</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">La tecnología aumenta cada vez más rápido y así mismo lo que las hace funcionar, tal es el caso de algo no tan nuevo pero que últimamente a dado que hablar tiene que ver con el .Net Framework y mas específicamente sobre WCF:</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><strong><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Windows Communication Foundation (WCF)</span></strong><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> es la plataforma de última generación de Microsoft diseñada para la creación de sistemas distribuidos. Se lanzó al mercado como parte de .NET Framework 3.0 con la idea de consolidar y ampliar las API de versiones anteriores de Framework (por ejemplo, los servicios web ASP.NET, .NET Remoting, Enterprise Services (COM+) y Message Queuing).</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Si bien empezar a usar WCF no es difícil, sí hay un par de pasos durante el proceso que quizás no sean del todo claros. En este artículo le guiará a través del proceso de creación y consumo de dos sencillos servicios. Para conseguir nuestro objetivo, abordaremos aspectos como las clases de servicio, los hosts de servicios, la configuración de servicios y los proxy de cliente.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Lo siguiente que recomendamos es tener instalados <a href="http://msdn2.microsoft.com/vstudio/aa973782.aspx">Visual Studio 2005,</a>.NET <a href="http://www.microsoft.com/downloads/details.aspx?familyid=10cc340b-f857-4a14-83f5-25634c3bf043">.NET Framework 3.0</a>y <a href="http://www.microsoft.com/downloads/details.aspx?familyid=f54f5537-cc86-4bf5-ae44-f5a1e805680d">las extensiones de Visual Studio 2005 para .NET Framework 3.0 (WCF y WPF).</a></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para empezar, se creo una solución vacía denominada <strong><span style="font-family:Verdana;">GettingStartedWithWCF.</span></strong>.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:10.5pt;line-height:140%;">Clases de servicio</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">La clase de servicio implementa la funcionalidad que exponen las operaciones del servicio. Se trata de una clase .NET normal sin restricciones de herencia. Para habilitar una clase como clase del servicio, se aplican los atributos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceContract</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">OperationContract</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> del espacio de nombres </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> Estos atributos pueden incluirse en la misma declaración de clase o simplemente en la declaración de una interfaz implementada por la clase. El uso de estos atributos no significa que la clase <em><span style="font-family:Verdana;">sea un</span></em> servicio. Significa simplemente que la clase <em><span style="font-family:Verdana;">puede estar</span></em> expuesta igual que un servicio. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Agregaremos un proyecto de biblioteca de clases para las clases de servicio. Para ello, haga clic con el botón secundario en la solución, seleccione Agregar | Nuevo proyecto y, a continuación, cree un proyecto de biblioteca de clases denominado <strong><span style="font-family:Verdana;">ServiceLib.</span></strong>.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Cambie el nombre del archivo Class1.vb por <strong><span style="font-family:Verdana;">MathService.vb.</span></strong>. El nombre de la clase debería cambiarse automáticamente por MathService. Si no es así, lleve a cabo el cambio manualmente.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Agregue una referencia a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">. Acabará usando este proyecto de manera habitual, ya que este ensamblado constituye la base de WCF.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Agregue dos métodos a la </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">clase</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> MathService: uno que agregue dos enteros (denominado </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Add</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">) y uno que permita obtener el cuadrado de un doble (denominado </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Square).</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">). Agregue una instrucción </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Imports</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> al espacio de nombres </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y, a continuación, incluya en esta clase el atributo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceContract</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y en los métodos el atributo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">OperationContract.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">Imports</span></code><code><span style="font-size:8.5pt;line-height:140%;"> System.ServiceModel</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="line-height:140%;">&lt;ServiceContract()&gt; _</span></code><br />
<code><span style="color:blue;line-height:140%;">PublicClass</span></code><code><span style="line-height:140%;"> MathService</span></code></p>
<p><code><span style="line-height:140%;">&lt;OperationContract()&gt; _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">PublicFunctionAdd</span>(<span style="color:blue;">ByVal</span> x <span style="color:blue;">AsInteger</span>, <span style="color:blue;">ByVal</span> y <span style="color:blue;">AsInteger</span>) _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">AsInteger</span></span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Return</span> x + y</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndFunction</span></span></code></p>
<p><code><span style="line-height:140%;">&lt;OperationContract()&gt; _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">PublicFunction</span> Square(<span style="color:blue;">ByVal</span> x <span style="color:blue;">AsDouble</span>) <span style="color:blue;">AsDouble</span></span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Return</span> x * x</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndFunction</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndClass</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Como se ha mencionado anteriormente, estos atributos también pueden aplicarse a una interfaz. Para verlo, agregue una clase nueva al proyecto ServiceLib denominada </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">HelloService</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y agregue el código que se muestra a continuación.</span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">Imports</span></code><code><span style="font-size:8.5pt;line-height:140%;"> System.ServiceModel</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="line-height:140%;">&lt;ServiceContract()&gt; _</span></code><br />
<code><span style="color:blue;line-height:140%;">PublicInterface</span></code><code><span style="line-height:140%;"> IHello</span></code></p>
<p><code><span style="line-height:140%;">&lt;OperationContract()&gt; _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Function</span> SayHello(<span style="color:blue;">ByVal</span> name <span style="color:blue;">AsString</span>) <span style="color:blue;">AsString</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndInterface</span></code></p>
<p><code><span style="line-height:140%;">PublicClass</span></code><code><span style="line-height:140%;"> HelloService</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Implements</span> IHello</span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">PublicFunction</span> SayHello(<span style="color:blue;">ByVal</span> name <span style="color:blue;">AsString</span>) _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">AsStringImplements</span> IHello.SayHello</span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">Return</span><span style="color:maroon;">&#8220;Hello &#8220;</span> + name</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndFunction</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndClass</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<h2><span style="font-size:10.5pt;line-height:140%;">Hosts de servicios</span></h2>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para que la funcionalidad contenida en la clase del servicio esté a disposición de las aplicaciones cliente, se necesita un host de servicio. Se trata de una aplicación que escuchará las solicitudes de los clientes y creará instancias de la clase del servicio con el fin de procesar estas solicitudes. Con WCF, es posible usar IIS como host, pero también puede crearse una aplicación personalizada. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">En este caso crearemos ambas clases de hosts, empezando por el hospedaje web. Haga clic con el botón secundario en la solución para agregar un sitio web. A continuación, seleccione Agregar | Nuevo sitio Web y elija la plantilla de servicio de WCF. Asegúrese de establecer la ubicación en una ruta de acceso del sistema de archivos en una carpeta del archivo de la solución.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Veamos rápidamente el código del texto reutilizable de Service.vb. La plantilla asume que vamos a codificar la funcionalidad para el servicio aquí, de modo que dispone de una interfaz y una clase de servicio de muestra con los atributos adecuados (además de un atributo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">DataContract,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">un tema que no entraremos a debatir en este artículo). Ya hemos creado las clases de servicio en el proyecto de ServiceLib y, por lo tanto, ahora podemos eliminar el archivo Servicio.vb. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Abra Service.svc y consulte los valores de los atributos. Los servicios de hospedaje web usan el mismo modelo que las antiguas tecnologías ASP.NET. Vinculan el archivo al que se pretende llegar con el archivo que contiene el código. Ésta es la misma técnica de código subyacente que se usa en ASP.NET. Dado que ya tenemos una clase de servicio compilada, podemos quitar este atributo y, a continuación, poner el nombre completo del tipo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MathService</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> como el valor para el </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">atributo Service.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">&lt;% @ServiceHost Language=VB Service=&#8221;ServiceLib.MathService&#8221; %&gt;</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Finalmente, agregue una referencia al proyecto ServiceLib.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Ahora cree la solución. Una vez creada, el explorador de soluciones deberá parecerse al que se muestra a continuación.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Esto es todo en cuanto al servicio de hospedaje web. Ahora seguiremos con el uso de aplicaciones personalizadas como hosts. Para ello, se puede usar una aplicación de Windows Forms, una aplicación de consola o bien un servicio de Windows. En este caso usaremos una aplicación de consola.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Haga clic con el botón secundario en la solución y elija Agregar | Nuevo proyecto. Cree una aplicación de consola denominada <strong><span style="font-family:Verdana;">ConsoleServiceHost.</span></strong>. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Dado que necesitaremos crear referencias a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> (para la clase que realizará el hospedaje) y </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceLib.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> (para la clase de servicio), primero agregue estas referencias.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Hacer que una aplicación .NET hospede un servicio es algo muy sencillo. Cree simplemente una instancia de tipo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceHost,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> asígnele el </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Type</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> correspondiente a la clase de servicio que va a hospedar y, a continuación, llame el método </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Open.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> Este método </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Open</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> hace que el host comience a escuchar las solicitudes. Como estamos usando una aplicación de consola, agregaremos una llamada a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ReadLine</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> para que la aplicación siga ejecutándose una vez abierto el host. También crearemos el host mediante una instrucción </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Using</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> para asegurarnos de que se cierra y se elimina correctamente al cerrarse la aplicación de consola. Antes usamos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MathService,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> así que ahora, para este proyecto, usaremos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">HelloService.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">Imports</span></code><code><span style="font-size:8.5pt;line-height:140%;"> System.ServiceModel</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="color:blue;line-height:140%;">Module</span></code><code><span style="line-height:140%;"> Module1</span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">Sub</span> Main()</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Dim</span> t <span style="color:blue;">As</span> Type = <span style="color:blue;">GetType</span>(ServiceLib.HelloService)</span></code><br />
<code><span style="line-height:140%;">Using host <span style="color:blue;">AsNew</span> ServiceHost(t)</span></code><br />
<code><span style="line-height:140%;">host.Open()</span></code></p>
<p><code><span style="line-height:140%;">Console.WriteLine(<span style="color:maroon;">&#8220;Service started&#8230;&#8221;</span>)</span></code><br />
<code><span style="line-height:140%;"></span></code><code><span style="font-size:8.5pt;line-height:140%;">Console.ReadLine()</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"><br />
<code><span style="line-height:140%;"><span style="color:blue;">End</span> Using</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndSub</span></span></code><span style="color:blue;"></span></span></p>
<p><code><span style="line-height:140%;">EndModule</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<h2><span style="font-size:10.5pt;line-height:140%;">Configuración del servicio</span></h2>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Es posible que haya observado que, al configurar los hosts, no indicamos la manera en la que el cliente debe comunicarse con el servicio. Pues bien, esto se consigue mediante la configuración del servicio. Y aunque la configuración puede especificarse por medio de código, lo más habitual será hacerlo mediante XML en un archivo .config. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para que un cliente pueda comunicarse con un servicio, se necesita un extremo. Un extremo está formado por tres componentes: una dirección, un enlace y un contrato. Éstos son los componentes fundamentales de WCF. La dirección es el URI que identifica dónde puede encontrarse el servicio. El enlace se usa para definir las reglas de la comunicación (por ejemplo, la codificación, si los mensajes necesitan ser protegidos, la manera en la que el servicio autenticará al cliente, etc.). Finalmente, el contrato define las operaciones expuestas por el servicio. Se trata básicamente de una referencia a la clase de servicio.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">WCF dispone de varios enlaces integrados configurados para usos empresariales habituales (consulte la tabla que hay a continuación). Es posible personalizar estos enlaces mediante su configuración, aunque también es posible crear enlaces personalizados propios para adaptarlos a las necesidades del sistema. Para no complicar demasiado el proceso, usaremos el enlace básico HTTP, que sigue el protocolo SOAP 1.1. </span></p>
<table border="0" cellPadding="0" cellSpacing="1" style="background:#4f81bd 0 50%;" class="MsoNormalTable">
<tr>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Nombre</span></td>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Transporte</span></td>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Codificación</span></td>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Interoperabilidad</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">basicHttpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netTcpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">TCP</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netPeerTcpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">P2P</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netNamedPipeBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">IPC</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">wsHttpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto, MTOM</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">wsFederationBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto, MTOM</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">wsDualHttpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto, MTOM</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netMsmqBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">MSMQ</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netIntegrationBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">MSMQ</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
</table>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Ahora necesitaremos configurar los hosts. Empezaremos con la aplicación de consola. En primer lugar necesitamos un sitio para colocar la información de configuración, de modo que agregaremos un archivo app.config. Haga clic con el botón secundario en el proyecto y elija Agregar | Nuevo elemento. A continuación, cree un archivo de configuración de la aplicación usando el nombre predeterminado (app.config).</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para configurar el extremo, se necesita una dirección, un enlace y un contrato. Veamos estos componentes en su orden inverso. El contrato ya quedó determinado a través del tipo de contrato que proporcionamos al constructor </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Cons