<?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:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>THE .NET WAY &#187; WCF</title>
	<atom:link href="http://www.thedotnetway.net/tag/wcf/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thedotnetway.net</link>
	<description>El blog Tecnológico de Emilio Torrens y Jordi Cladera</description>
	<lastBuildDate>Thu, 29 Jul 2010 08:27:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Comunicar Servicios Win32 con WCF</title>
		<link>http://www.thedotnetway.net/2009/09/25/comunicar-servicios-win32-con-wcf/</link>
		<comments>http://www.thedotnetway.net/2009/09/25/comunicar-servicios-win32-con-wcf/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 09:25:54 +0000</pubDate>
		<dc:creator>Emilio Torrens</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://www.thedotnetway.net/2009/09/25/comunicar-servicios-win32-con-wcf/</guid>
		<description><![CDATA[Estamos haciendo unos cambios en una de nuestras aplicaciones para que funcione relativamente bien en entornos de alta disponibilidad, uno de los cambios es que los Servicios Win32, que no pueden estar activos a la vez en varios servidores, se comuniquen entre ellos de manera que siempre uno, pero solo uno de la “granja” este [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.thedotnetway.net/wp-content/uploads/2009/09/WCF.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="WCF" border="0" alt="WCF" align="left" src="http://www.thedotnetway.net/wp-content/uploads/2009/09/WCF_thumb.jpg" width="198" height="123" /></a>Estamos haciendo unos cambios en una de nuestras aplicaciones para que funcione relativamente bien en entornos de <a href="http://es.wikipedia.org/wiki/Alta_disponibilidad" target="_blank">alta disponibilidad</a>, uno de los cambios es que los Servicios Win32, que no pueden estar activos a la vez en varios servidores, se comuniquen entre ellos de manera que siempre uno, pero solo uno de la “<a href="http://en.wikipedia.org/wiki/Server_farm" target="_blank">granja</a>” este activo.</p>
<p>Para eso hemos usado comunicación <a href="http://es.wikipedia.org/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> con <a href="http://es.wikipedia.org/wiki/Windows_Communication_Foundation" target="_blank">WCF</a>, cada Servicio Win32 es servidor y cliente a la vez, de esa manera se comunican en forma de árbol para saber si tienen que activarse o no.</p>
<p>En este Post no me enrollare con todo el sistema solo sobre como hostear un servicio WCF en un Servicio Win32 y como crear un cliente para consumirlo.</p>
<p>Podemos añadir el servicio al proyecto con el témplate o añadirlo a mano, en realidad solo se trata de una clase, un interface y una nueva sección en el app.config</p>
<p>En el interface definimos el servicio y los métodos:</p>
<pre class="code"><span style="color: blue">namespace </span>Service
{
    [<span style="color: #2b91af">ServiceContract</span>]
    <span style="color: blue">public interface </span><span style="color: #2b91af">IMyTcpServer
    </span>{
        [<span style="color: #2b91af">OperationContract</span>]
        <span style="color: blue">bool </span>Ping();
    }
} </pre>
<p>La clase debe implementar el interface y es donde pondremos el código:</p>
<pre class="code"><span style="color: blue">namespace </span>Service
{
    <span style="color: blue">public class </span><span style="color: #2b91af">MyTcpServer </span>: <span style="color: #2b91af">IMyTcpServer
    </span>{

        <span style="color: blue">public bool </span>Ping()
        {
            <span style="color: blue">return true</span>;
        }

    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>La sección del app.config donde definiremos que tipo de comunicación queremos, la dirección, el puerto, etc., en este caso comunicación tcp en el puerto 8731</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">services</span><span style="color: blue">&gt;
  &lt;</span><span style="color: #a31515">service </span><span style="color: red">behaviorConfiguration</span><span style="color: blue">=</span>&quot;<span style="color: blue">Service.MyTcpServerBehavior</span>&quot;
    <span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">Service.MyTcpServer</span>&quot;<span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">endpoint </span><span style="color: red">address</span><span style="color: blue">=</span>&quot;&quot; <span style="color: red">binding</span><span style="color: blue">=</span>&quot;<span style="color: blue">netTcpBinding</span>&quot;
              <span style="color: red">contract</span><span style="color: blue">=</span>&quot;<span style="color: blue">Service.IMyTcpServer</span>&quot;<span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">identity</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">dns </span><span style="color: red">value</span><span style="color: blue">=</span>&quot;<span style="color: blue">localhost</span>&quot; <span style="color: blue">/&gt;
      &lt;/</span><span style="color: #a31515">identity</span><span style="color: blue">&gt;
    &lt;/</span><span style="color: #a31515">endpoint</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">endpoint </span><span style="color: red">address</span><span style="color: blue">=</span>&quot;<span style="color: blue">mex</span>&quot; <span style="color: red">binding</span><span style="color: blue">=</span>&quot;<span style="color: blue">mexTcpBinding</span>&quot;
              <span style="color: red">contract</span><span style="color: blue">=</span>&quot;<span style="color: blue">IMetadataExchange</span>&quot; <span style="color: blue">/&gt;
    &lt;</span><span style="color: #a31515">host</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">baseAddresses</span><span style="color: blue">&gt;
        &lt;</span><span style="color: #a31515">add </span><span style="color: red">baseAddress</span><span style="color: blue">=</span>&quot;<span style="color: blue">net.tcp://localhost:8731/Service/MyTcpServer/</span>&quot; <span style="color: blue">/&gt;
      &lt;/</span><span style="color: #a31515">baseAddresses</span><span style="color: blue">&gt;
    &lt;/</span><span style="color: #a31515">host</span><span style="color: blue">&gt;
  &lt;/</span><span style="color: #a31515">service</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">services</span><span style="color: blue">&gt;</span></pre>
<p>Ya tenemos el servicio configurado, solo nos queda poner código en el OnStart del servicio Win32 para arrancarlo, el código es el siguiente:</p>
<pre class="code"><span style="color: #2b91af">ServiceHost </span>tcpHostServer = <span style="color: blue">new </span><span style="color: #2b91af">ServiceHost</span>(<span style="color: blue">typeof</span>(<span style="color: #2b91af">MyTcpServer</span>));
tcpHostServer.Open();</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Ya tenemos nuestro servicio Win32 con su método de ping para poder comprobar si esta funcionando o no.</p>
<p>La parte cliente es realmente sencilla, ya que añadimos una Referencia de Servicio, como hacíamos antes con una referencia web, y el IDE nos crea todo el código necesario para consumir el servicio, la única diferencia es que el cliente no tiene una propiedad para indicarle la dirección del servicio, para indicarle una dirección distinta a la que crea en app.config cuando añadimos la referencia hay que hacerlo de la siguiente manera:</p>
<pre class="code"><span style="color: #2b91af">NetTcpBinding </span>netTcpBinding = <span style="color: blue">new </span><span style="color: #2b91af">NetTcpBinding</span>();
<span style="color: #2b91af">EndpointAddress </span>endpointAddress =
    <span style="color: blue">new </span><span style="color: #2b91af">EndpointAddress</span>(<span style="color: #a31515">&quot;net.tcp://direccion:elPuerto/ElServicio/&quot;</span>);
<span style="color: blue">using </span>(MyTcpServerClient client =
       <span style="color: blue">new </span>MyTcpServerClient(netTcpBinding, endpointAddress))
{
    <span style="color: blue">return </span>client.Ping();
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">Y listo <img src='http://www.thedotnetway.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
            </pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thedotnetway.net/2009/09/25/comunicar-servicios-win32-con-wcf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
