<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Return(GiS); : WCF</title><link>http://geeks.ms/blogs/gtorres/archive/tags/WCF/default.aspx</link><description>Etiquetas: WCF</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0 [...] </title><link>http://geeks.ms/blogs/gtorres/archive/2010/04/27/could-not-load-type-system-servicemodel-activation-httpmodule-from-assembly-system-servicemodel-version-3-0-0-0.aspx</link><pubDate>Tue, 27 Apr 2010 06:55:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:175652</guid><dc:creator>Gisela</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=175652</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=175652</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2010/04/27/could-not-load-type-system-servicemodel-activation-httpmodule-from-assembly-system-servicemodel-version-3-0-0-0.aspx#comments</comments><description>&lt;p&gt;Uno de los incidentes que nos podemos encontrar al tener instalado el nuevo Framework 4.0 es que nuestras aplicaciones con WCF anteriores dejen de funcionar por el siguiente motivo:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/ServiceModel-error.PNG"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/ServiceModel-error.PNG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para solucionarlo, debemos acceder al servidor de aplicaciones (IIS), nos posicionamos en el sitio que nos est&amp;aacute; fallando y accedemos al apartado de &lt;b&gt;M&amp;oacute;dulos:&lt;/b&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Modulos.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Modulos.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez all&amp;iacute;, quitamos la versi&amp;oacute;n 3.0 de ServiceModel, quedando &amp;uacute;nicamente la versi&amp;oacute;n 4.0.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Eliminar-service-model.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Eliminar-service-model.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Espero que sea de utilidad.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=175652" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/gtorres/archive/tags/WCF/default.aspx">WCF</category><category domain="http://geeks.ms/blogs/gtorres/archive/tags/IIS/default.aspx">IIS</category></item><item><title>InstanceContextMode en WCF</title><link>http://geeks.ms/blogs/gtorres/archive/2009/12/19/InstanceContextMode-en-WCF.aspx</link><pubDate>Sat, 19 Dec 2009 21:47:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:163010</guid><dc:creator>Gisela</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=163010</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=163010</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2009/12/19/InstanceContextMode-en-WCF.aspx#comments</comments><description>&lt;p&gt;Cuando &lt;a target="_blank" href="http://geeks.ms/blogs/gtorres/archive/2009/10/27/wcf-windows-comunication-foundation.aspx"&gt;creamos un servicio con Windows Communication Foundation&lt;/a&gt;, debemos conocer&amp;nbsp; el comportamiento que queremos que tenga en cuanto a sus instancias se refiere. Para controlar el tiempo de vida del contexto disponemos de los siguientes modos: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;PerCall: &lt;/b&gt;Cada cliente crear&amp;aacute; una nueva instancia por llamada al servicio.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PerSession&lt;/b&gt;: Se genera una instancia por sesi&amp;oacute;n.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Single: &lt;/b&gt;Se utiliza la misma instancia para todas las peticiones independientemente del cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Instance-Context-Modes.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Instance-Context-Modes.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como he encontrado mucha literatura al respecto y los ejemplos han sido pr&amp;aacute;cticamente el mismo en todos los sitios, he creado uno personalizado donde se realiza el env&amp;iacute;o de tweets e intento recuperar los mismos utilizando los distintos modos.&lt;br /&gt; Creo un proyecto de tipo &lt;b&gt;WCF Service Library:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Proyecto-InstanceContextModeWCF.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Proyecto-InstanceContextModeWCF.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elimino tanto la clase y la interfaz generada por la plantilla y creo una clase &lt;b&gt;Tweet.cs&lt;/b&gt; con el rol de &lt;b&gt;DataContract&lt;/b&gt;.&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border:1px solid silver;margin:20px 0px 10px;padding:4px;overflow:auto;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;cursor:text;max-height:500px;width:97.5%;direction:ltr;text-align:left;"&gt;
&lt;pre id="codeSnippet" style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.Serialization;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; InstanceContextModeWCF&lt;br /&gt;{&lt;br /&gt;    [DataContract]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Tweet&lt;br /&gt;    {&lt;br /&gt;        [DataMember]&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { get; set; }&lt;br /&gt;        [DataMember]&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; User { get; set; }&lt;br /&gt;        [DataMember]&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Message { get; set; }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;Una interfaz como &lt;b&gt;ServiceContract&lt;/b&gt;&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border:1px solid silver;margin:20px 0px 10px;padding:4px;overflow:auto;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;cursor:text;max-height:600px;width:97.5%;direction:ltr;text-align:left;"&gt;
&lt;pre id="codeSnippet" style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.ServiceModel;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; InstanceContextModeWCF&lt;br /&gt;{&lt;br /&gt;    [ServiceContract]&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; ITwitter&lt;br /&gt;    {&lt;br /&gt;        [OperationContract]&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; SendTweet(Tweet tweet);&lt;br /&gt;&lt;br /&gt;        [OperationContract]&lt;br /&gt;        List&amp;lt;Tweet&amp;gt; GetMyTweets();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;Y por &amp;uacute;ltimo la clase que implementa nuestro contrato.&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border:1px solid silver;margin:20px 0px 10px;padding:4px;overflow:auto;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;cursor:text;max-height:400px;width:97.5%;direction:ltr;text-align:left;"&gt;
&lt;pre id="codeSnippet" style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.ServiceModel;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; InstanceContextModeWCF&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:#008000;"&gt;//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#008000;"&gt;//[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Twitter : ITwitter&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; List&amp;lt;Tweet&amp;gt; _tweets = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Tweet&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; SendTweet(Tweet tweet)&lt;br /&gt;        {&lt;br /&gt;            _tweets.Add(tweet);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Tweet&amp;gt; GetMyTweets()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _tweets;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;En la clase &lt;b&gt;Twitter&lt;/b&gt; he dejado comentadas las tres posibilidades. &amp;iexcl;Veamos cada una de ellas!&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;b&gt;PER CALL&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Cuando activamos el modo &lt;b&gt;PerCall&lt;/b&gt; nuestro servicio se comportar&amp;aacute; de la siguiente manera: Crear&amp;aacute; una instancia para realizar la llamada al m&amp;eacute;todo solicitado y, una vez que haya finalizado la llamada, destruir&amp;aacute; la instancia creada.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/PerCall-Client.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/PerCall-Client.png" width="530" border="0" height="562" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para este primer ejemplo he activado la primera l&amp;iacute;nea comentada y he seguido los pasos en el orden que se&amp;ntilde;alo en la imagen. Como podemos ver, he creado una conexi&amp;oacute;n con el programa que est&amp;aacute; actuando como servidor, he rellenado el apartado de mensaje y he enviado el mismo. En este caso, no ha sido posible recuperar el tweet al realizar una nueva llamada con PerCall.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;b&gt;PER SESSION&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Con &lt;b&gt;PerSession &lt;/b&gt;vamos a utilizar la misma instancia hasta que la sesi&amp;oacute;n finalice. Es decir, un cliente crea un canal y tiene la posibilidad de realizar distintas llamadas a distintos m&amp;eacute;todos dentro del mismo contexto. Siguiendo el mismo ejemplo, habilitando la segunda l&amp;iacute;nea y deshabilitando la primera, realizamos las mismas acciones desde el cliente.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/PerSession-Client.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/PerSession-Client.png" width="525" border="0" height="557" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como la instancia permanece con vida durante toda la sesi&amp;oacute;n, el cliente es capaz de poder enviar un tweet y despu&amp;eacute;s recuperarlo. Sin embargo, si nosotros pulsamos sobre &lt;b&gt;Disconnect&amp;nbsp; &lt;/b&gt;e intentamos recuperar el tweet enviado a trav&amp;eacute;s del bot&amp;oacute;n Get All!, la informaci&amp;oacute;n ya habr&amp;aacute; desaparecido al haber creado una nueva sesi&amp;oacute;n.&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="border:1px solid silver;margin:20px 0px 10px;padding:4px;overflow:auto;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;cursor:text;max-height:800px;width:97.5%;direction:ltr;text-align:left;"&gt;
&lt;pre id="codeSnippet" style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnConnect_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    _channel = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ChannelFactory&amp;lt;ITwitter&amp;gt;(&lt;span style="color:#006080;"&gt;&amp;quot;TwitterService&amp;quot;&lt;/span&gt;);&lt;br /&gt;    _client = _channel.CreateChannel();&lt;br /&gt;    lblState.Text = &lt;span style="color:#006080;"&gt;&amp;quot;Connected!&amp;quot;&lt;/span&gt;;&lt;br /&gt;    lblState.ForeColor = System.Drawing.Color.Blue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnDisconnect_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    _channel.Close();&lt;br /&gt;    lblState.Text = &lt;span style="color:#006080;"&gt;&amp;quot;Disconnected!&amp;quot;&lt;/span&gt;;&lt;br /&gt;    lblState.ForeColor = System.Drawing.Color.Red;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/PerSession-despues-de-finalizar-la-sesi_F300_n.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/PerSession-despues-de-finalizar-la-sesi_F300_n.png" width="529" border="0" height="561" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;SINGLE&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;El modo &lt;b&gt;Single &lt;/b&gt;se utiliza para mantener una misma instancia desde la primera petici&amp;oacute;n de un cliente cualquiera hasta que el servicio se ha parado completamente. &lt;/p&gt;
&lt;p&gt;Si habilitamos el &amp;uacute;ltimo modo comentado en el c&amp;oacute;digo, y deshabilitamos el anterior, podemos realizar los siguientes pasos:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Single-Client.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Single-Client.png" width="511" border="0" height="542" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si cerramos y abrimos de nuevo el cliente, sin cerrar el programa servidor, y pulsamos de nuevo en &lt;b&gt;Get All!&amp;nbsp; &lt;/b&gt;descubrimos que nuestro tweet sigue con vida ;)&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Recuperar-valor-con-Single-Mode.png" width="516" border="0" height="547" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Adjunto el &lt;a target="_blank" href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.16.30.10/InstanceContextModeWCF.rar"&gt;ejemplo completo&lt;/a&gt;, con el servicio, cliente y servidor. Est&amp;aacute;n los tres proyectos en una misma soluci&amp;oacute;n. En cualquier caso, podemos abrir los .exe ubicados en el bin de cada proyecto como administrador o abrir dos Visual Studio con credenciales de administrador para poder debuggear en Vista o Windows 7 =)&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=163010" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.16.30.10/InstanceContextModeWCF.rar" length="99036" type="application/octet-stream" /><category domain="http://geeks.ms/blogs/gtorres/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Cliente JSON para WCF</title><link>http://geeks.ms/blogs/gtorres/archive/2009/10/30/cliente-JSON-para-WCF.aspx</link><pubDate>Fri, 30 Oct 2009 08:26:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:159224</guid><dc:creator>Gisela</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=159224</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=159224</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2009/10/30/cliente-JSON-para-WCF.aspx#comments</comments><description>&lt;p&gt;En un post anterior, mostr&amp;eacute; como crear un &lt;a target="_blank" href="http://geeks.ms/blogs/gtorres/archive/2009/10/27/wcf-windows-comunication-foundation.aspx"&gt;servicio web con Windows Communication Foundation&lt;/a&gt;. Para consumir el mismo, vamos a crear un peque&amp;ntilde;o cliente JSON con JQuery.&lt;br /&gt;Creamos un proyecto ASP.NET Web Application:&lt;/p&gt;
&lt;div class="separator" style="clear:both;text-align:center;"&gt;
&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Nuevo-proyecto.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Nuevo-proyecto.png" border="0" height="339" width="504" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;
Antes de comenzar con nuestro c&amp;oacute;digo, necesitamos la librer&amp;iacute;a de JQuery, la cual podemos obtenerla en este &lt;a target="_blank" href="http://www.google.es/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAcQFjAA&amp;amp;url=http%3A%2F%2Fjquery.com%2F&amp;amp;ei=vqjqSsiiGcq6jAep1OSqDQ&amp;amp;usg=AFQjCNFA7CZ5sWRDhHPuipmhL7zVksjC2A&amp;amp;sig2=M2EUf66NGB-xym0erLbY_w"&gt;enlace&lt;/a&gt;. Una vez descargada, agregamos el archivo a nuestra soluci&amp;oacute;n.&lt;br /&gt;Por otro lado, vamos a crear un nuevo archivo JScript, llamado &lt;b&gt;JSON.js&lt;/b&gt;, donde implementaremos la funcionalidad que llamar&amp;aacute; a nuestro servicio y recoger&amp;aacute; el resultado. Nuestro proyecto quedar&amp;iacute;a de la siguiente manera:&lt;br /&gt;&lt;span style="font-family:Tahoma;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="separator" style="clear:both;text-align:center;"&gt;
&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Solution-Explorer.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Solution-Explorer.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align:center;"&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;br /&gt;
He utilizado la p&amp;aacute;gina Default.aspx para mostrar dos textbox para recoger los valores y dos botones con los que llamaremos al servicio.&lt;/p&gt;
&lt;div style="text-align:left;"&gt;
&lt;pre id="codeSnippet" style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;&lt;span style="background-color:#ffff00;"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeBehind=&amp;quot;Default.aspx.cs&amp;quot; Inherits=&amp;quot;ClienteJSON._Default&amp;quot; %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#800000;"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;html&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;PUBLIC&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;html&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Cliente JSON&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Calculos&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lblNumeroUno&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          Introduce n&amp;uacute;mero:&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;txtNumUno&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lblNumeroDos&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          Introduce otro n&amp;uacute;mero:&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;txtNumDos&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;btnSumar&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Sumar&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;btnRestar&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Restar&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;jquery-1.3.2.js&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt; &lt;/span&gt;&lt;span id="lnum2" style="color:#606060;"&gt; &lt;/span&gt;&amp;lt;script type=&lt;span style="color:#006080;"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span style="color:#006080;"&gt;&amp;quot;JSON.js&amp;quot;&lt;/span&gt;&amp;gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;html&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;Por &amp;uacute;ltimo, s&amp;oacute;lo nos quedar&amp;iacute;a llamar a nuestro servicio web y mostrar el resultado que nos aporta, en funci&amp;oacute;n de si queremos Sumar o Restar los n&amp;uacute;mero que introducimos a trav&amp;eacute;s de la interfaz. Abrimos el archivo &lt;b&gt;JSON.js&lt;/b&gt; e introducimos lo siguiente:
&lt;/div&gt;
&lt;p&gt;&lt;span style="font-family:Tahoma;"&gt;
&lt;div id="codeSnippetWrapper" style="border:1px solid silver;margin:20px 0px 10px;padding:4px;overflow:auto;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;cursor:text;max-height:800px;width:97.5%;direction:ltr;text-align:left;"&gt;
&lt;pre id="codeSnippet" style="border-style:none;margin:0em;padding:0px;overflow:visible;background-color:#f4f4f4;font-family:&amp;#39;Courier New&amp;#39;,Courier,Monospace;font-size:8pt;line-height:12pt;color:black;width:100%;direction:ltr;text-align:left;"&gt;$(&lt;span style="color:#006080;"&gt;&amp;quot;#btnSumar&amp;quot;&lt;/span&gt;).bind(&lt;span style="color:#006080;"&gt;&amp;quot;click&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(e) {&lt;br /&gt; &lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;params&lt;/span&gt; = { &lt;span style="color:#006080;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;: $(&lt;span style="color:#006080;"&gt;&amp;#39;#txtNumUno&amp;#39;&lt;/span&gt;).val(), &lt;span style="color:#006080;"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;: $(&lt;span style="color:#006080;"&gt;&amp;#39;#txtNumDos&amp;#39;&lt;/span&gt;).val() };&lt;br /&gt;&lt;br /&gt;  $.ajax({&lt;br /&gt;      type: &lt;span style="color:#006080;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;,&lt;br /&gt;      url: &lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/WCF/Service.svc/json/Suma&amp;quot;&lt;/span&gt;,&lt;br /&gt;      data: &lt;span style="color:#0000ff;"&gt;params&lt;/span&gt;,&lt;br /&gt;      contentType: &lt;span style="color:#006080;"&gt;&amp;quot;application/json; charset=utf-8&amp;quot;&lt;/span&gt;,&lt;br /&gt;      dataType: &lt;span style="color:#006080;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;,&lt;br /&gt;      success: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(msg) {&lt;br /&gt;          alert(&lt;span style="color:#006080;"&gt;&amp;quot;Resultado Suma: &amp;quot;&lt;/span&gt; + msg.d.Result);&lt;br /&gt;      }&lt;br /&gt;   });&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$(&lt;span style="color:#006080;"&gt;&amp;quot;#btnRestar&amp;quot;&lt;/span&gt;).bind(&lt;span style="color:#006080;"&gt;&amp;quot;click&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(e) {&lt;br /&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;params&lt;/span&gt; = { &lt;span style="color:#006080;"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;: $(&lt;span style="color:#006080;"&gt;&amp;#39;#txtNumUno&amp;#39;&lt;/span&gt;).val(), &lt;span style="color:#006080;"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;: $(&lt;span style="color:#006080;"&gt;&amp;#39;#txtNumDos&amp;#39;&lt;/span&gt;).val() };&lt;br /&gt;&lt;br /&gt;  $.ajax({&lt;br /&gt;      type: &lt;span style="color:#006080;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;,&lt;br /&gt;      url: &lt;span style="color:#006080;"&gt;&amp;quot;http://localhost/WCF/Service.svc/json/Resta&amp;quot;&lt;/span&gt;,&lt;br /&gt;      data: &lt;span style="color:#0000ff;"&gt;params&lt;/span&gt;,&lt;br /&gt;      contentType: &lt;span style="color:#006080;"&gt;&amp;quot;application/json; charset=utf-8&amp;quot;&lt;/span&gt;,&lt;br /&gt;      dataType: &lt;span style="color:#006080;"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;,&lt;br /&gt;      success: &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;(msg) {&lt;br /&gt;          alert(&lt;span style="color:#006080;"&gt;&amp;quot;Resultado Resta: &amp;quot;&lt;/span&gt; + msg.d.Result);&lt;br /&gt;      }&lt;br /&gt;  });&lt;br /&gt;});&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;,Courier,monospace;"&gt;&lt;/span&gt;La verdad es que, teniendo JQuery, es bastante simple realizar este tipo de funcionalidad. He utilizado el m&amp;eacute;todo &lt;b&gt;Bind&lt;/b&gt;, para asignarles el evento a cada uno de nuestros botones. De esta manera, no tenemos que introducir ning&amp;uacute;n c&amp;oacute;digo de javascript en nuestro aspx.&lt;i&gt; M&amp;aacute;s adelante me gustar&amp;iacute;a enfocarme m&amp;aacute;s en la manera de funcionar de esta librer&amp;iacute;a&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;En el mismo sitio donde bindeamos el evento click a nuestro bot&amp;oacute;n, creamos la funci&amp;oacute;n que se va a ejecutar.&lt;br /&gt;Utilizamos la variable &lt;b&gt;params &lt;/b&gt;para montar nuestra cadena de par&amp;aacute;metros. Hay que tener en cuenta que &lt;b&gt;&lt;span style="text-decoration:underline;"&gt;el nombre de cada par&amp;aacute;metro &lt;/span&gt;&lt;span style="text-decoration:underline;"&gt;se debe corresponder con el que tienen en el servicio web&lt;/span&gt;&lt;/b&gt; (en este caso a y b).&lt;br /&gt;Creamos un objeto ajax con los atributos &lt;b&gt;type &lt;/b&gt;(el tipo de HTTP Verb que vamos a utilizar), la &lt;b&gt;url &lt;/b&gt;donde se aloja nuestro servicio, seguido del m&amp;eacute;todo que vamos a invocar, en &lt;b&gt;data &lt;/b&gt;le pasamos los par&amp;aacute;metros necesarios para el c&amp;aacute;lculo solicitado, &lt;b&gt;contentType &lt;/b&gt;indica c&amp;oacute;mo va a evaluar JQuery la respuesta y c&amp;oacute;mo nos la va a devolver (En el caso de JSON eval&amp;uacute;a la respuesta como tal y nos retorna un objeto javascript), &lt;b&gt;dataType &lt;/b&gt;es el formato en el que estamos pasando nuestro par&amp;aacute;metros y en la parte &lt;b&gt;success &lt;/b&gt;se adjunta la funci&amp;oacute;n que se lanzar&amp;aacute; cuando haya terminado el proceso en caso de &amp;eacute;xito. En un principio, esto es lo m&amp;iacute;nimo que debemos usar.&lt;br /&gt;&lt;br /&gt;Si arrancamos la aplicaci&amp;oacute;n, ya tenemos nuestra Suma y nuestra Resta funcionando con un servicio web en WCF y su cliente en JSON.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;iexcl;Saludos!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualizaci&amp;oacute;n 31/10/2009: &lt;/b&gt;En el archivo JSON.js, he modificado&lt;b&gt; &lt;/b&gt;la forma de recuperar el valor de los textbox por&lt;b&gt; .val(),&lt;/b&gt; que ser&amp;iacute;a la forma correcta con JQuery. De la otra manera,&lt;b&gt; $(&amp;#39;#textbox&amp;#39;)[0].value&lt;/b&gt;, era un h&amp;iacute;brido que funciona exactamente igual, pero creo que queda m&amp;aacute;s elegante con &lt;b&gt;.val().&lt;/b&gt; &amp;iexcl;Saludos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159224" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.15.92.24/ClienteJSON.rar" length="56638" type="application/download" /><category domain="http://geeks.ms/blogs/gtorres/archive/tags/WCF/default.aspx">WCF</category><category domain="http://geeks.ms/blogs/gtorres/archive/tags/JQuery/default.aspx">JQuery</category><category domain="http://geeks.ms/blogs/gtorres/archive/tags/JSON/default.aspx">JSON</category></item><item><title>Creando un Web Service con WCF</title><link>http://geeks.ms/blogs/gtorres/archive/2009/10/27/wcf-windows-comunication-foundation.aspx</link><pubDate>Tue, 27 Oct 2009 08:41:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:159016</guid><dc:creator>Gisela</dc:creator><slash:comments>17</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/rsscomments.aspx?PostID=159016</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/gtorres/commentapi.aspx?PostID=159016</wfw:comment><comments>http://geeks.ms/blogs/gtorres/archive/2009/10/27/wcf-windows-comunication-foundation.aspx#comments</comments><description>&lt;p&gt;Windows Communication Foundation fue una de las novedades de .NET Framework 3.0, la cual permite la creaci&amp;oacute;n de sistemas distribuidos orientados a servicios. &lt;br /&gt;Con Visual Studio 2008, disponemos de una plantilla que nos genera todo lo necesario para empezar a trabajar con ello. No obstante, en esta ocasi&amp;oacute;n, dejaremos de lado la misma para poder visualizar claramente qu&amp;eacute; es lo necesario para que WCF funcione. &lt;/p&gt;
&lt;h3&gt;CREACI&amp;Oacute;N DEL PROYECTO&lt;/h3&gt;
&lt;p&gt;Creamos un nuevo proyecto de tipo librer&amp;iacute;a: &lt;/p&gt;
&lt;div align="left" class="separator" style="text-align:center;clear:both;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Proyecto-de-tipo-Librer_ED00_a.png"&gt;&lt;img height="357" width="530" src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Proyecto-de-tipo-Librer_ED00_a.png" border="0" alt="" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;
&lt;p&gt;Incluimos las librer&amp;iacute;as &lt;b&gt;System.ServiceModel&lt;/b&gt; y &lt;b&gt;System.Runtime.Serialization&lt;/b&gt;. &lt;/p&gt;
&lt;div class="separator" style="text-align:center;clear:both;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Referencias-WCF.png"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/gtorres/Referencias-WCF.png" border="0" alt="" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;EL CONTRATO (CONTRACT)&lt;/h3&gt;
&lt;p&gt;Lo primero que debemos crear es una interfaz que tendr&amp;aacute; como misi&amp;oacute;n ser el &lt;b&gt;Contrato &lt;/b&gt;del servicio web. Lo que nos indica el mismo es qu&amp;eacute; funcionalidades tiene operativas el servicio de cara a las aplicaciones que lo van a consumir. &lt;br /&gt;Creamos una interfaz llamada&lt;b&gt; IService.cs&lt;/b&gt; y codificamos las siguientes funcionalidades:&lt;/p&gt;
&lt;p&gt;using System.ServiceModel; &lt;br /&gt;using System.ServiceModel.Web; &lt;br /&gt;using System.Runtime.Serialization; &lt;/p&gt;
&lt;p&gt;namespace WCF &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ServiceContract] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public interface IService &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [OperationContract] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [WebGet] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Resultado Suma(int a, int b); &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [OperationContract] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [WebGet] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Resultado Resta(int a, int b); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp; [DataContract] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Resultado &lt;br /&gt;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DataMember] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Result { get; set; } &lt;br /&gt;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;Tenemos los siguientes atributos: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;ServiceContract&lt;/b&gt;, el cual indica que nuestra interfaz va a hacer las veces de contrato. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;OperationContract&lt;/b&gt; por cada m&amp;eacute;todo que queramos exponer. &lt;/li&gt;
&lt;li&gt;Por &amp;uacute;ltimo, dentro del mismo archivo (&lt;span style="text-decoration:underline;"&gt;&lt;b&gt;No es recomendable&lt;/b&gt;&lt;/span&gt;) hemos creado una peque&amp;ntilde;a clase con el atributo &lt;b&gt;DataContract&lt;/b&gt; que ser&amp;aacute; el objeto serializado que viajar&amp;aacute; como respuesta a las peticiones tanto de la Suma como la Resta. Por cada miembro dentro del contrato de datos, contiene un &lt;b&gt;DataMember&lt;/b&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es una clase perfectamente normal que contiene los m&amp;eacute;todos que definimos en el contrato. Si creamos c&amp;oacute;digo adicional, para realizar cualquier otra operaci&amp;oacute;n, no ser&amp;iacute;a visible al no estar definido en la interfaz del servicio. &lt;/p&gt;
&lt;h3&gt;EL ARCHIVO SVC&lt;/h3&gt;
&lt;p&gt;Un archivo importante a tener muy en cuenta es el archivo con extensi&amp;oacute;n &lt;b&gt;svc&lt;/b&gt;, el cual er&amp;aacute; de utilidad a IIS cuando publiquemos el servicio. A&amp;ntilde;adimos un documento en blanco, llamado &lt;b&gt;Service.svc&lt;/b&gt;, con el siguiente contenido: &lt;/p&gt;
&lt;p&gt;&amp;lt;%@ ServiceHost Service=&amp;quot;WCF.Service&amp;quot; %&amp;gt;&lt;/p&gt;
&lt;p&gt;Le indicamos el namespace de la&amp;nbsp; implementaci&amp;oacute;n del contrato como valor de Service para que pueda localizarlo. &lt;/p&gt;
&lt;h3&gt;DLL FUERA DE DEBUG Y RELEASE&lt;/h3&gt;
&lt;p&gt;Para que IIS pueda localizar correctamente las librer&amp;iacute;as del servicio web, debemos &lt;b&gt;cambiar las propiedades de Build&lt;/b&gt; en nuestro proyecto y dejar nuestro &amp;quot;Output path&amp;quot; de la siguiente forma: &lt;/p&gt;
&lt;div class="separator" style="text-align:center;clear:both;"&gt;&lt;a href="http://2.bp.blogspot.com/_FFv0c-2nHyQ/SqrjhSOIF1I/AAAAAAAAAcY/o34pm3MFjZY/s1600-h/Output+path.png" style="margin-left:1em;margin-right:1em;"&gt;&lt;img src="http://2.bp.blogspot.com/_FFv0c-2nHyQ/SqrjhSOIF1I/AAAAAAAAAcY/o34pm3MFjZY/s400/Output+path.png" border="0" alt="" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;
&lt;p&gt;Por &amp;uacute;ltimo, quiz&amp;aacute;s la parte m&amp;aacute;s compleja, necesitamos configurar el archivo web.config con los &lt;b&gt;endpoints &lt;/b&gt;necesarios para aceptar peticiones. Dependiendo de los distintos tipos de comunicacion que tengamos, deberemos implementar m&amp;aacute;s o menos endpoints. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;Qu&amp;eacute; es un Endpoint?&lt;/b&gt;&lt;i&gt; &lt;br /&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Un endpoint est&amp;aacute; compuesto por tres valores: &lt;b&gt;Address &lt;/b&gt;(&amp;iquest;D&amp;oacute;nde?), &lt;b&gt;Binding &lt;/b&gt;(&amp;iquest;C&amp;oacute;mo?) y &lt;b&gt;Contract &lt;/b&gt;(&amp;iquest;Qu&amp;eacute;?). La suma de ellos genera una serie de requisitos para poder establecer una conexi&amp;oacute;n con nuestro servidor. Un servicio con WCF puede disponder de varios endpoints distintos, por lo que el n&amp;uacute;mero de clientes de diferentes caracter&amp;iacute;sticas pueden consumirlo.&lt;/p&gt;
&lt;p&gt;Creamos pues un archivo Web.config y eliminamos el contenido. En este post, voy a crear un endpoint para un cliente JSON.&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bindings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webHttpBinding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;binding name=&amp;quot;webBinding&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/binding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/webHttpBinding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bindings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service name=&amp;quot;WCF.Service&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; behaviorConfiguration=&amp;quot;MiBehavior&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint address=&amp;quot;json&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding=&amp;quot;webHttpBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindingConfiguration=&amp;quot;webBinding&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; behaviorConfiguration=&amp;quot;jsonBehavior&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contract=&amp;quot;WCF.IService&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpointBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;jsonBehavior&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;enableWebScript/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/endpointBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;MiBehavior&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;True&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviors&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/system.serviceModel&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt;
&lt;p&gt;Dentro de la secci&amp;oacute;n &lt;b&gt;system.serviceModel&lt;/b&gt; tenemos:&lt;/p&gt;
&lt;p&gt;Por un lado, la secci&amp;oacute;n de los bidings disponibles, que en este caso s&amp;oacute;lo tenemos el necesario para una configuraci&amp;oacute;n de JSON; services donde indicamos el &lt;span style="text-decoration:underline;"&gt;address&lt;/span&gt;, el nombre de nuestro &lt;span style="text-decoration:underline;"&gt;binding&lt;/span&gt;, el &lt;span style="text-decoration:underline;"&gt;behavior&lt;/span&gt; (indicado m&amp;aacute;s abajo)&amp;nbsp; y el nombre del contrato que queremos utilizar. &lt;br /&gt;&lt;br /&gt;Llegados a este punto, podemos crear una aplicaci&amp;oacute;n que tenga hosteado el servicio que acabamos de crear o bien utilizar IIS, configurando como documento de inicio Service.svc. &lt;/p&gt;
&lt;h3&gt;IMPLEMENTACI&amp;Oacute;N DEL CONTRATO &lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;El siguiente paso es crear una clase que implemente el contrato que acabamos de definir. &lt;/p&gt;
&lt;p&gt;namespace WCF&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Service : IService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Resultado Suma(int a, int b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var resultado = new Resultado {Result = a + b};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return resultado;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Resultado Resta(int a, int b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var resultado = new Resultado {Result = a - b};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return resultado;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Si accedemos a las dos direcciones que indico abajo a trav&amp;eacute;s del explorador, deber&amp;iacute;a devolvernos un archivo en formato JSON por cada petici&amp;oacute;n. &lt;br /&gt;&lt;br /&gt;http://localhost/WCF/Service.svc/json/Suma &lt;br /&gt;&lt;br /&gt;http://localhost/WCF/Service.svc/json/Resta&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;Ambas devolver&amp;iacute;an cero porque no se les est&amp;aacute; pasando ning&amp;uacute;n par&amp;aacute;metro. &lt;br /&gt;En el &lt;a target="_blank" href="http://geeks.ms/blogs/gtorres/archive/2009/10/30/cliente-JSON-para-WCF.aspx"&gt;siguiente post de WCF&lt;/a&gt;, crear&amp;eacute; un cliente que realice y reciba la respuesta con JSON para poder acceder a nuestro servicio web y pasarle los par&amp;aacute;metros necesarios.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Saludos!&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159016" width="1" height="1"&gt;</description><enclosure url="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.15.90.16/WCF.rar" length="15862" type="application/octet-stream" /><category domain="http://geeks.ms/blogs/gtorres/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/gtorres/archive/tags/WCF/default.aspx">WCF</category></item></channel></rss>