<?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>tucaz.blog.now() &#187; WCF</title>
	<atom:link href="http://blog.tucaz.net/category/desenvolvimento/wcf-desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tucaz.net</link>
	<description>Software architecture, agile and all that stuff that you can find everywhere</description>
	<lastBuildDate>Wed, 01 Sep 2010 01:28:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lidando melhor com WCF &#8211; Ciclo de vida no cliente</title>
		<link>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente/</link>
		<comments>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 17:02:31 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[channelfactory]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=415</guid>
		<description><![CDATA[Início de uma pequena série a respeito de melhores práticas no uso do WCF em .NET. Neste primeiro post falo a respeito do ChannelFactory<t> e como seu ciclo de vida deve ser gerenciado. </t>]]></description>
			<content:encoded><![CDATA[<p><strong><em>&lt;Importante&gt;</em></strong></p>
<p>Todos sabem que WCF é uma plataforma poderosa e extensível. O que muita gente não sabe é que WCF é para poucos.</p>
<p>WCF é uma plataforma que permite a construção de sistemas distribuidos e sistemas distribuidos raramente são necessários. De maneira simplificada, podemos dizer que um sistema é distribuido quando tem seus componentes instalados em mais de um computador.</p>
<p>O problema da construção de sistemas distribuídos é que devido a não centralização de seus compnentes existe um overhead de comunicação entre os computadores e serialização/deserialização de objetos e isso consome muita memória e banda de rede.</p>
<p>Como gastamos mais recursos do que necessário temos como resultado final um aumento no tempo de resposta e gasto extra de hardware que, as vezes pode ser um problema grave além é claro do aumento da complexidade técnica.</p>
<p>No entanto, não sei por qual motivo, no momento em que lançou o produto, a Microsoft esqueceu de avisar seus &#8220;consumidores&#8221; a respeito destes pequenos detalhes. Talvez porque queria promover o produto?</p>
<p><strong>&lt;/Importante&gt;</strong></p>
<p><strong>&lt;Importante 2&gt;</strong></p>
<p>WCF é uma tecnologia relativamente simples, mas apenas depois que você entende o BeABá da coisa (ou ABC<strong>[1]</strong> no caso do WCF). Até lá, qualquer coisa que fuja do point&amp;click que o Visual Studio nos oferece é relativamente complexo.</p>
<p>Portanto, sugiro que antes de aplicar WCF você procure entender um pouco mais dos fundamentos e do papel de cada objeto que ele utiliza.<strong> </strong><strong> </strong></p>
<p><strong><em>&lt;/Importante 2&gt;</em><br />
</strong></p>
<p>Agora que entendemos que não devemos usar WCF em toda aplicação que construimos (talvez isso seja tópico pra outro post?) vou falar um pouco da experiência que estou tendo com esta tecnologia e das boas práticas e atalhos que conheci.</p>
<p>Pretendo fazer uma pequena série e pra começar vou abordar boas práticas de consumo de serviços WCF, ou em outras palavras, como acessar um serviço WCF a partir de um cliente da maneira mais eficiente possível.</p>
<p>Para que seja possível consumir um serviço WCF é necessário que alguém o tenha publicado e também que tenha disponibilizado o WSDL<strong>[2]</strong> do serviço.</p>
<p>O WSDL nada mais é do que um arquivo XML que descreve quais são os tipos de dados que o serviço irá trafegar e quais operações ele oferece.</p>
<p>Geralmente, assim que temos um WSDL para consumir vamos ao Visual Studio e utilizamos a funcionalidade de <em>Add Service Reference</em> que ele nos oferece para gerar o objeto proxy que irá cuidar pra nós da comunicação com WCF. A partir dai utilizamos este objeto em toda nossa aplicação<em></em>. E este é o nosso maior erro.</p>
<p>Este proxy, gerado pelo Wizard, encapsula todas as classes necessárias para ler o WSDL, criar os tipos necessários e lidar com os canais de comunicação em cada operação que executamos. No entanto, ele o faz da <strong>pior</strong> maneira possível.</p>
<p>Cada vez que invocamos uma operação através deste proxy, ele cria uma instância da classe <a title="ChannelFactory&lt;T&gt; @ Msdn.com" href="http://msdn.microsoft.com/en-us/library/ms576132.aspx" target="_self">ChannelFactory&lt;T&gt;</a>. Esta classe é responsável por ler as configurações definidas em nosso app.config e baseado nestas configurações abrir os canais de comunicação com o serviço que iremos consumir. Este processo é <strong>muito lento</strong>, pois todos os sockets, listeners e objetos necessários da própria infra estrutura do WCF são criados e configurados neste momento.</p>
<p>No entanto, este processo não precisa ser feito a cada chamada para o serviço WCF uma vez que estas informações não mudarão enquanto a aplicação estiver rodando. Então, para otimizar bastante o consumo de serviços devemos ignorar o proxy gerado pelo Wizard e cuidar da criação e destruição de canais nós mesmos mantendo este objeto (ChannelFactory&lt;T&gt;) como <a title="Singleton @ Wikipedia.org" href="http://pt.wikipedia.org/wiki/Singleton" target="_self">Singleton</a> que irá durar pelo tempo de vida da aplicação. Dessa forma toda vez que chamamos uma operação remota não existe a necessidade de executar o setup e tear down desse objeto.</p>
<p>Para facilitar a gerência desses objetos construi uma pequena DLL que é composta apenas de uma classe. O código está disponível no <a title="Communications Manager @ GitHub" href="http://github.com/tucaz/CommunicationsManager" target="_self">github</a> e a <a title="Communications Manager @ GitHub" href="http://github.com/tucaz/CommunicationsManager/downloads" target="_self">DLL compilada está aqui</a>. A <a title="Communications Manager Docs @ GitHub" href="http://wiki.github.com/tucaz/CommunicationsManager/">documentação inicial também está lá</a>. Tudo pronto para ser usado.</p>
<p><strong>Referências adicionais (e importantes)</strong></p>
<ul>
<li><a title="Performance Improvement for WCF Client Proxy Creation in .NET 3.5 and Best Practices @ Wenlong Dong's Blog" href="http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx" target="_self">Performance improvement for WCF client proxy creation in .NET 3.5 and best practices @ Wenlong Dong&#8217;s Blog</a></li>
<li><a title="Internals - Proxy de Serviço WCF @ Israel Aece" href="http://www.israelaece.com/post/Internals-Proxy-de-servicos-WCF.aspx" target="_self">Internals &#8211; Proxy de Serviços WCF @ Israel Aece</a></li>
<li><a title="WCF Client Channel Pool - Improved Client Performance @ Glavs Blog" href="http://weblogs.asp.net/pglavich/archive/2007/05/07/wcf-client-channel-pool-improved-client-performance.aspx">WCF Client Channel Pool &#8211; Improved Client Performance @ Glavs Blog</a></li>
<li><a href="http://stackoverflow.com/questions/1825990/wcf-channelfactory-and-channel-caching-in-asp-net-client-application" target="_self">Bate papo que me levou a este componente @ StackOverflow</a></li>
</ul>
<p><strong>[1]</strong> ABC = Address, Bindings e Contracts<br />
<strong>[2]</strong> É possível consumir um serviço WCF sem acesso ao WSDL, mas este é um cenário pouco comum</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Verbos HTTP: GET e POST. Você sabe mesmo a diferença?</title>
		<link>http://blog.tucaz.net/2009/11/22/verbos-http-get-e-post-voce-sabe-mesmo-a-diferenca/</link>
		<comments>http://blog.tucaz.net/2009/11/22/verbos-http-get-e-post-voce-sabe-mesmo-a-diferenca/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 00:23:51 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[WCF]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[verbos http]]></category>
		<category><![CDATA[webrequest]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=386</guid>
		<description><![CDATA[Sabe a diferença entre POST e GET em um ambiente REST? Não? Então leia este post e assista o vídeo linkado para entender!]]></description>
			<content:encoded><![CDATA[<p>Até pouco tempo atrás quando eu fazia entrevistas a fim de contratar desenvolvedores, não importando o nível, eu fazia a mesma pergunta: &#8220;Você sabe a diferença entre GET e POST em uma request HTTP?&#8221;. Por incrível que pareça poucas pessoas sabiam responder. Na maioria das vezes alguém que se considerava um desenvolvedor web não tinha a menor idéia  sobre o que eu estava falando. Acho que era culpa do RH que fazia uma pré-seleção muito ruim, mas anyway&#8230;</p>
<p>Hoje essa informação já chegou a maioria dos desenvolvedores web (já era hora, não?) então a pergunta no contexto original perdeu um pouco a validade. Todo mundo sabe que enviar formulários via GET manda as informações pela querystring e que POST manda encapsulado dentro da request e bla bla bla. No entanto, com a nova &#8220;moda&#8221;, que acho bem bacana aliás, de REST(ful) a pergunta ganhou um contexto novo e tornou a ser válida: você sabe qual a diferença dos verbos em uma request HTTP? Não só de GET e POST, mas de todo o resto?</p>
<p>Decidi fazer esse post rápido enquanto retomava meus estudos a respeito de WCF e assistia a um vídeo do MIX do ano passado que está no final deste post.</p>
<p>POST não escala, GET sim. Porquê? Por causa da semântica! POST, PUT, DELETE e outros verbos são por definição non-safe e com efeitos colaterais, ou seja, é esperado que uma request usando esses verbos modifique algum recurso. Dessa forma é impossível fazer cache desse tipo de chamada. E como todos nós sabemos, sem cache = sem escalabilidade, isn&#8217;t that right?</p>
<p>Vamos tomar como exemplo uma chamada a URI imaginária: <em>http://meusite.com.br/usuario/novo</em> passando via POST todas as informações necessárias para se criar um usuário. Se tudo correr bem, vamos receber como resposta um HTTP Status Code 201 indicando que o recurso foi criado e a URL para acessa-lo. Provavelmente algo como <em>http://meusite.com.br/usuário/765</em>.</p>
<p>Agora a pergunta: é seguro para os intermediários dessa request tais como proxies, clientes, etc efetuarem o cache disso? Não! Imagine um usuário do sistema que utiliza esse recurso tentando cadastrar um novo usuário com os mesmos dados. Ao invés de receber uma resposta de conflito ele receberia um status 201 dizendo que o recurso foi criado. De fato o recurso foi criado, mas será que deveriamos mostrar isso pra ele quando na verdade a criação desse recurso já havia acontecido e a ação que ele executou neste momento não trouxe sucesso? Acho que não.</p>
<p>Já o GET, por definição é cacheavel, pois não possui efeitos colaterais. Ele apenas devolve o recurso desejado sem modificar nada. Claro que isso só acontece quando bem usado, pois tem muita gente que utiliza esse verbo de maneira errada e baseado em parâmetros executa ações que deveriam ser associadas a outros verbos HTTP. Como não modifica nenhuma informação é possível efetuar o cache desse recurso com segurança.</p>
<p>Pra quem quiser ver mais a respeito de <a title="Caching REST with WCF in MIX 09" href="http://videos.visitmix.com/MIX09/T64M" target="_self">REST, GET, POST e cache, basta acessar o vídeo no site do MIX 09</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2009/11/22/verbos-http-get-e-post-voce-sabe-mesmo-a-diferenca/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Novo Microsoft Architecture Guide lançado</title>
		<link>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado/</link>
		<comments>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 13:49:12 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Architecture Guide]]></category>
		<category><![CDATA[Arquitetura de Referência]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=87</guid>
		<description><![CDATA[Lá atrás, em 2002, a Microsoft lançou a primeira versão da sua arquitetura de referência para os cenários mais comuns de aplicações corporativas.
Esse é um documento, que apesar de antigo, é bastante interessante e ainda atual na maioria dos aspectos. Eu descobri esse documento cerca de uns 1 ano e meio atrás quando procurava melhores [...]]]></description>
			<content:encoded><![CDATA[<p>Lá atrás, em 2002, a Microsoft lançou a <a href="http://msdn.microsoft.com/en-us/library/ms978348.aspx" target="_blank">primeira versão</a> da sua arquitetura de referência para os cenários mais comuns de aplicações corporativas.</p>
<p>Esse é um documento, que apesar de antigo, é bastante interessante e ainda atual na maioria dos aspectos. Eu descobri esse documento cerca de uns 1 ano e meio atrás quando procurava melhores práticas para aplicar no primeiro sistema pelo qual eu seria responsável.</p>
<p>Sempre achei uma pena o fato de eles não manterem esse documento atualizado. Talvez isso acontecesse, pois é sempre complicado falar a respeito de arquiteturas de referência já que cada caso é um caso.</p>
<p>No entanto, pra nossa felicidade, eles lançaram uma nova versão esse mês e está disponível através <a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Guidelines&amp;referringTitle=Home" target="_blank">deste link</a> no Codeplex.</p>
<p>O documento apresenta quais decisões tomar e porque toma-las em uma série de cenários. Desde aplicações desktop até aplicações web com SOA e RIA.</p>
<p>Ainda não tive tempo de ir a fundo no documento, mas parece estar bastante atualizado.</p>
<p>Há algum tempo atrás, eu procurava saber porque raios alguém construiria uma aplicação utilizando WCF/Remoting/Web Services se essa aplicação não teria seus componentes de negócio reutilizados. Nunca entendi isso e achava um absurdo a Microsoft não disponibilizar nenhum &#8220;guia&#8221; (eu nunca achei, pelo menos) que dissesse quando devo distribuir as camadas de uma aplicação fisicamente e quando não. Infelizmente algumas coisas nós acabamos aprendendo só depois de aplicar e apanhar um pouco.</p>
<p>Nesse documento, pelo menos <a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Web%20Application%20Archetype&amp;referringTitle=Application%20Types" target="_self">este ponto a Microsoft esclareceu</a> e isso já é suficiente pra me deixar bastante feliz.</p>
<p>Esse documento não vai evitar que nós, desenvolvedores, cometamos erros, mas acredito que é muito importante os fornecedores de plataformas e tecnologias grandes como .NET se pronunciarem e fornecerem guias, mesmo que simples e com uma visão bem macro, para que as pessoas não fiquem perdidas e cometam erros demais em seus sistemas.</p>
<p>Ponto pra Microsoft.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>E quem disse que o WCF não tem limite?</title>
		<link>http://blog.tucaz.net/2008/05/17/e-quem-disse-que-o-wcf-nao-tem-limite/</link>
		<comments>http://blog.tucaz.net/2008/05/17/e-quem-disse-que-o-wcf-nao-tem-limite/#comments</comments>
		<pubDate>Sat, 17 May 2008 02:33:00 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://tucaz.wordpress.com/2008/05/17/e-quem-disse-que-o-wcf-nao-tem-limite/</guid>
		<description><![CDATA[Apesar de ter estudado bastante, feito alguns POCs e lido Inside  Windows Communication Foundation inteiro (é, nem eu acredito), desde que  comecei a trabalhar com WCF em aplicações grandes de verdade, que não tinham  como objetivo servir apenas um departamento de 50 usuários, estou me sentindo  meio barriga verde&#8230;
Hoje foi mais [...]]]></description>
			<content:encoded><![CDATA[<p>Apesar de ter estudado bastante, feito alguns POCs e lido <a href="http://www.amazon.com/Inside-Windows-Communication-Foundation-Developer/dp/0735623066">Inside  Windows Communication Foundation</a> inteiro (é, nem eu acredito), desde que  comecei a trabalhar com WCF em aplicações grandes de verdade, que não tinham  como objetivo servir apenas um departamento de 50 usuários, estou me sentindo  meio <a href="http://blog.tucaz.net/2008/05/16/o-profissional-barriga-verde/" target="_blank">barriga verde</a>&#8230;</p>
<p>Hoje foi mais um dos momentos (em uma outra oportunidade eu coloco os outros) em  que a coisa quase deu m****! Por uma série de motivos decidimos constuir em um  único serviço WCF todas as funcionalidades de um determinado módulo do sistema.  Sendo assim, o serviço está hoje com 63 método e crescendo&#8230; No entanto, qual  foi a surpresa quando decidi atualizar a referência para o serviço após muda-lo  novamente?</p>
<div style="text-align:center;"><em>&#8220;The maximum nametable character count quota (16384) has been exceeded while  reading XML data. The nametable is a data structure used to store strings  encountered during XML processing &#8211; long XML documents with non-repeating  element names, attribute names and attribute values may trigger this quota. This  quota may be increased by changing the MaxNameTableCharCount property on the  XmlDictionaryReaderQuotas object used when creating the XML reader&#8221;</em></div>
<div style="text-align:center;"><em><br />
</em></div>
<div style="text-align:center;">
<div style="text-align:left;">
<div>Ou seja, ferrou! A equipe de desenvolvimento ficou quase 2 horas  &#8220;semi-parada&#8221; esperando a resolução do problema. Depois de pesquisar bastante  ainda não tinha achado uma solução que fosse satisfatória para o problema. Na  prática, o problema acontece pois o XMLDictionary, por padrão, não consegue  armazenar mais do que o valor default de chaves/valor referentes ao XML gerado  pelo MEX/WSDL do WCF.</div>
<div>Algumas das soluções apresentadas envolviam gerar o proxy do WCF  diretamente através do svcutil.exe ou até mesmo em runtime! Para atualizações  feitas de tempos em tempos até acredito que a utilização do svcutil.exe  diretamente não é problema, mas no meio do desenvolvimento é um parto!</div>
<div>No final, juntando alguns posts em blogs e msdn consegui chegar a solução  que me servia: Criar um arquivo de configuração para o svcutil.exe com um  bindind customizado aumentando esse limite. Existem duas formas de fazer:</div>
<div></div>
<div>1) Criar um arquivo svcutil.exe.config no diretório padrão onde o  svcutil.exe está (geralmente dentro de \Program Files\Microsoft Visual Studio  9.0\) contendo as configurações abaixo. No entanto não sei porque (e nem vou  saber, porque no momento a opção 2 resolve pra mim) meu svcutil.exe se encontra  no diretório do framework e se eu colocar o arquivo.config lá quando o VS2008  chamar o svcutil.exe por trás dos panos o arquivo.config não é carregado.</div>
<div></div>
<div>2) Modificar o machine.config (geralmente dentro de  \WINDOWS\Microsoft.NET\Framework\v2.0.50727) adicionando as chaves abaixo.</div>
<div>
<p>Caso a chave &lt;client&gt; já exista, adicione o &lt;endpoint&gt; dentro da existente.</p>
<pre name="code" class="xml">
<system .serviceModel>
	<bindings>
		<custombinding>
			<binding name="CustomSizeMex">
				<textmessageencoding>
					<readerquotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
				</textmessageencoding> <httptransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
			</binding>
		</custombinding>
	</bindings>
	<client>
		<endpoint binding="customBinding" bindingConfiguration="CustomSizeMex" contract="IMetadataExchange" name="http" />
	</client>
</system>
</pre>
<p>E é isso! Reiniciar o VS2008 e mandar atualizar a referência ao serviço monstro! Tudo funcionando bonitinho</p>
<p>Espero que daqui pra frente os sustos diminuam&#8230; <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/05/17/e-quem-disse-que-o-wcf-nao-tem-limite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
