<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Hal on Fullest Use</title>
	<atom:link href="http://halonfullestuse.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://halonfullestuse.wordpress.com</link>
	<description>Another day, another piece of code.</description>
	<lastBuildDate>Thu, 20 Aug 2009 02:01:23 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='halonfullestuse.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/677b72146169457ab98cf07e7ffb4676?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Hal on Fullest Use</title>
		<link>http://halonfullestuse.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://halonfullestuse.wordpress.com/osd.xml" title="Hal on Fullest Use" />
	<atom:link rel='hub' href='http://halonfullestuse.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Hello world!</title>
		<link>http://halonfullestuse.wordpress.com/2009/08/11/hello-world/</link>
		<comments>http://halonfullestuse.wordpress.com/2009/08/11/hello-world/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 02:48:25 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[Useless stuff]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Olá a todos. Criei este novo blog já que o anterior não estava me ajudando muito na criação de posts maiores. O WordPress parece ser bem mais amigo nestas horas e com isso acho que posso conseguir mais ânimo para redigir. Boa leitura.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=halonfullestuse.wordpress.com&amp;blog=8957117&amp;post=1&amp;subd=halonfullestuse&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos.</p>
<p>Criei este novo blog já que o anterior não estava me ajudando muito na criação de posts maiores.</p>
<p>O WordPress parece ser bem mais amigo nestas horas e com isso acho que posso conseguir mais ânimo para redigir.</p>
<p>Boa leitura.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/halonfullestuse.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/halonfullestuse.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/halonfullestuse.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/halonfullestuse.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/halonfullestuse.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/halonfullestuse.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/halonfullestuse.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/halonfullestuse.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=halonfullestuse.wordpress.com&amp;blog=8957117&amp;post=1&amp;subd=halonfullestuse&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://halonfullestuse.wordpress.com/2009/08/11/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>
	</item>
		<item>
		<title>Criando um proxy para WebService &#8211; Parte 1</title>
		<link>http://halonfullestuse.wordpress.com/2009/08/11/8/</link>
		<comments>http://halonfullestuse.wordpress.com/2009/08/11/8/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 03:27:18 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://halonfullestuse.wordpress.com/2009/08/11/8/</guid>
		<description><![CDATA[Existem diversas formas de se criar Proxies para WebServices para quem usa o .Net. A mais simples é a mera criação de uma WebReference através do VisualStudio, que cuida de criar todo o suporte ao consumo dos métodos existentes no WebService, bem como todos os tipos de objetos envolvidos nas operações do mesmo, tanto os [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=halonfullestuse.wordpress.com&amp;blog=8957117&amp;post=8&amp;subd=halonfullestuse&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Existem diversas formas de se criar Proxies para WebServices para quem usa o .Net. A mais simples é a mera criação de uma WebReference através do VisualStudio, que cuida de criar todo o suporte ao consumo dos métodos existentes no WebService, bem como todos os tipos de objetos envolvidos nas operações do mesmo, tanto os envolvidos no envelope de Request quanto no envolvidos no envelope de Response.</p>
<p>Para os desenvolvedores mais exigentes, a ferramenta wsdl.exe dá um pouco mais de opções antes de criar o proxy, como o nome da classe que será gerada, seu namespace, dentre outras opções.</p>
<p>Existem ainda outros geradores de proxy para WebServices feitos por terceiros, mas qualquer gerador de proxy faz a geração baseado no conteúdo do <a href="http://pt.wikipedia.org/wiki/Web_service#WSDL">Web Service Description Language (wsdl)</a>, que nada mais é que um XML schema descrevendo o WebService, seus métodos, os tipos necessários para o envio de um envelope ao invocar um método e os tipos que o envelope de resposta irá conter.</p>
<p>Em geral, tudo isso é muito simples e fácil (ou deveria ser).</p>
<p>Vou contar um pouco de história para que entendam como esse tipo de estratégia pode ser útil, em que tipo de cenário ela pode ser uma opção a ser avaliada. Caso você apenas queira saber como implementar, você pode pular este bloco.</p>
<p>Na empresa onde trabalho, por exemplo, apareceu uma necessidade de fazermos o consumo de um WebService, cujo WSDL estava simplesmente impossível de se usar para a criação do Proxy através de ferramenta. WSDL&#8217;s podem referenciar outros XSD&#8217;s de apoio (para tipos de objetos que são compartilhados para uso em outros WebServices), e no caso deste em particular haviam mais de 150 XSD&#8217;s descrevendo tipos para os mais diversos métodos contidos no WebService, e no meio desta multidão de tipos, alguns referenciavam a outros e estes aos primeiros novamente, sendo difícil detectar todas as referências circulares que estavam espalhadas pelos XSD&#8217;s, o que deixava os geradores de proxy perdidos.</p>
<p>Tentamos usar os geradores de proxies convencionais (WebReference &#8211; wsdl e wsewsdl* &#8211; que é o gerador de proxies para uma API chamada WSE &#8211; Web Services Enhancements) mas nenhum deles obteve sucesso, ora apresentando problemas para referências a tipos contidos em XSD&#8217;s não declarados (exigindo a inclusão destes na linha de comando do gerador) e a cada XSD que se incluía, um novo era exigido até que nenhum outro era pedido mas o gerador dava um erro de StackOverflow. Usando o wsdl.exe, o resultado foi este. Já usando o wsewsdlx.exe, a inclusão dos XSD&#8217;s satélites não foi necessária. Contudo o StackOverflow também ocorria.</p>
<p>O problema do StackOverflow era devido a algumas implicações que os XSD&#8217;s apresentavam por não seguirem o que chamamos de <a href="http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html">Basic Profile</a>, que é um acordo comum entre algumas empresas do mercado que definiram uma espeficação de Interoperabilidade entre plataformas usando WebServices (WS-I &#8211; WebServices Interoperability). As ferramentas de geração de proxy se baseiam na especificação do Basic Profile, por que consideram que os WebServices (que são usados justamente para estabelecer uma comunicação entre aplicações de qualquer plataforma) obedeçam as normas estabelecidas.</p>
<p>Agora imaginem ter que inspecionar cada um dos 150 XSD&#8217;s procurando por todos os pontos onde a especificação do Basic Profile não foi obedecida.</p>
<p>O problema é que tudo que precisávamos era de apenas um único método simples do WebService, que recebia 4 strings e devolvia um objeto simples com 6 valores entre strings e inteiros. Decidimos fazer nosso próprio proxy sem a ajuda de um gerador. Agora, consumir um webservice na mão pode parecer uma atitude meio ignorante, mas o seu Proxy fica limpo, deixando apenas aquilo que você irá usar.</p>
<p>Esta técnica é novidade para mim, mas o pessoal da empresa já estava acostumado a lidar com essa situação, visto que tiveram os mesmos problemas em outros WebServices do mesmo cliente. A técnica adotada por eles anteriormente é diferente da que vou apresentar aqui, já que eles usam o SoapToolKit, que usarei em um outro exemplo mais tarde.</p>
<p>Agora chega de papo-furado e vamos colocar a mão na massa.</p>
<p><h4>Primeiro Exemplo de Criação de Proxy &#8211; Derivando a classe WebClientProtocol</h4>
</p>
<p>Neste primeiro exemplo faremos exatamente o que o wsdl faz. Significa que seu Proxy ficará muito parecido com o que seria se fôsse gerado com o wsdl.</p>
<p>Vamos ao WebService primeiro. Eu criei um projeto MiscServices usando o template Asp.Net Web Service Application.</p>
<p><a href="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5VdQR_amI/AAAAAAAAG4A/jaIkQjLwJA0/s1600-h/NewProject.gif"><img style="text-align:center;width:320px;display:block;height:215px;cursor:hand;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5VdQR_amI/AAAAAAAAG4A/jaIkQjLwJA0/s320/NewProject.gif" border="0" alt="" /></a></p>
<p>O VisualStudio já vai criar para você uma classe que herda de System.Web.Services.WebService, que é o que caracteriza um WebService em uma solução .Net.</p>
<p><a href="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5Wl9EVCSI/AAAAAAAAG4I/ruRRhV10CmU/s1600-h/NewClass.gif"><img style="text-align:center;width:320px;display:block;height:179px;cursor:hand;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5Wl9EVCSI/AAAAAAAAG4I/ruRRhV10CmU/s320/NewClass.gif" border="0" alt="" /></a></p>
<p>Note que já existe um método no nosso WebService chamado HelloWorld. Manteremos este afim de fazer um teste simples e criaremos outros para aumentar gradualmente a complexidade dos testes.</p>
<p>Note que o webservice é criado com um namespace inicial Default. É extremamente recomendável que você mude aquele namespace para um que caracterize o webservice como parte do seu domínio.</p>
<p>Eu mudei o nome da classe e o namespace para WebServiceTeste, mas ao fazer isso você precisa corrigir o arquivo asmx, alterando o nome da classe antigo para o novo nome.</p>
<p>Também criei uma classe simples para fazer um teste com objetos no WebService:</p>
<p><a href="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5ZzsT6u3I/AAAAAAAAG4Q/zYWRIpyLXaU/s1600-h/Book.gif"><img style="text-align:center;width:320px;display:block;height:84px;cursor:hand;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5ZzsT6u3I/AAAAAAAAG4Q/zYWRIpyLXaU/s320/Book.gif" border="0" alt="" /></a></p>
<p>E finalmente, os demais métodos do nosso webservice de teste:</p>
<p><a href="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5b4Hehl-I/AAAAAAAAG4Y/zV6YvbiOyWQ/s1600-h/Methods.gif"><img style="text-align:center;width:282px;display:block;height:320px;cursor:hand;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5b4Hehl-I/AAAAAAAAG4Y/zV6YvbiOyWQ/s320/Methods.gif" border="0" alt="" /></a></p>
<p>Nosso WebService está pronto. Você já pode compilá-lo. Vamos agora criar um novo projeto para ser o client. No caso vou criar um Console Application.</p>
<p><a href="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5fnW1YjYI/AAAAAAAAG4g/yycZ6iuSIyE/s1600-h/NewClientProject.gif"><img style="text-align:center;width:320px;display:block;height:204px;cursor:hand;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5fnW1YjYI/AAAAAAAAG4g/yycZ6iuSIyE/s320/NewClientProject.gif" border="0" alt="" /></a></p>
<p>O primeiro passo é obter o WSDL. Sem o qual não faria o menor sentido criar um proxy. O WSDL é peça fundamental para quem pretende consumir um WebService e, conseqüentemente, sua publicação é fundamental para que o fornecedor permita que seu cliente o acesse.</p>
<p><a href="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5iISkvplI/AAAAAAAAG4o/3dj1ZIOeSmk/s1600-h/wsdl.gif"><img style="text-align:center;width:320px;display:block;height:210px;cursor:hand;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5iISkvplI/AAAAAAAAG4o/3dj1ZIOeSmk/s320/wsdl.gif" border="0" alt="" /></a></p>
<p>Ao abrir o WSDL você precisa reparar em alguns elementos imprenscindíveis: O namespace, Os elementos de operação (operation name=&#8230;) que são os métodos e os Tipos (complexType name&#8230;) dos objetos que os métodos esperam receber e pretendem incluir na resposta.</p>
<p>O segundo passo é <a href="http://msdn.microsoft.com/en-us/library/system.web.services.protocols.webclientprotocol.aspx">criar uma classe que derive direta ou indiretamente de WebClientProtocol</a>, no nosso caso usaremos a <a href="http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol.aspx">SoapHttpClientProtocol</a> por que ela usa envelopes Soap para fazer a troca de mensagens, e o Soap é um protocolo feito sob medida para WebServices, embora seja possível usar outros protocolos, como o HTTP. Estas classes podem ser encontradas se você fizer uma referência ao assembly System.Web.Services. Elas se encontram no namespace System.Web.Services.Protocols.</p>
<p>Esta classe será o proxy do WebService que você tem, então obviamente você precisa declarar nela um método que representará a invocação do método que você precisa consumir do webService. Neste exemplo, os métodos HelloWorld, Soma, GetBook e PostBook são os métodos que queremos consumir, portanto criaremos no proxy os métodos equivalentes para consumí-los. Os métodos no nosso proxy não precisam ter o mesmo nome definido no wsdl, embora precisem anotar um binding ao mesmo schema, como irei mostrar depois. No entanto eu criarei os métodos de acordo com seus nomes no wsdl.</p>
<p>Digamos que você não tenha o conhecimento da classe implementada do webservice (que é o que naturalmente iria acontecer num cenário real), então você precisa pegar a definição do método no WSDL. Basta procurar pelas definições de operação &#8220;operation name=&#8221;.</p>
<p><a href="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn5l12wInPI/AAAAAAAAG4w/Py4QIPzh52E/s1600-h/Operations.gif"><img style="text-align:center;width:320px;display:block;height:224px;cursor:hand;margin:0 auto 10px;" src="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn5l12wInPI/AAAAAAAAG4w/Py4QIPzh52E/s320/Operations.gif" border="0" alt="" /></a></p>
<p>Note que cada elemento de operação possui uma definição de parametros de entrada e de saída (wsdl:input message e wsdl:output message). Se você pegar o método HelloWorld, por exemplo, em wsdl:input a descrição da mensagem assina o schema &#8220;tns:HelloWorldSoapIn&#8221;. &#8220;tns&#8221; é o prefixo usado para o namespace do próprio WebService, o que significa que este schema está declarado neste mesmo documento. Basta procurar por ele e você verá que ele remete a um outro schema: tns:HelloWorld. O wsdl:output assina o schama HelloWorldSoapOut que remete ao tns:HelloWorldResponse. Se procurar pelo schema tns:HelloWorld vê que ele é um complexType vazio, por que o método não recebe parametros. Já o tns:HelloWorldResponse contem um complexType com uma string chamada HelloWorldResult que pode ocorrer no mínimo nenhuma vez e no máximo uma vez, significando que ela pode ser nula. O que nos indica a assinatura do nosso método HelloWorld no proxy: Método sem parâmetros que retorna uma string.</p>
<p>Mas no caso dos nossos métodos PostBook e GetBook que usam um objeto como parâmetro de entrada e como resposta respectivamente? De acordo com o schema na figura acima eles apontam para GetBookSoapOut na saída do GetBook (que devolve um objeto Book) e PostBookSoapIn na entrada do PostBook (que recebe um objeto Book). Estes apontam para GetBookResponse e PostBook respectivamente. E procurando por estes outros dois você enxerga o problema:</p>
<p><a href="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn5p6cvSwxI/AAAAAAAAG44/pO9pa0wTX4w/s1600-h/ComplexTypes.gif"><img style="text-align:center;width:282px;display:block;height:320px;cursor:hand;margin:0 auto 10px;" src="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn5p6cvSwxI/AAAAAAAAG44/pO9pa0wTX4w/s320/ComplexTypes.gif" border="0" alt="" /></a></p>
<p>Notem que o GetBookResponse possui um objeto chamado GetBookResult do tipo tns:Book que está declarado logo abaixo. O type Book possui duas propriedades: Title e Author e ambas são string. Daí você já sabe: precisa implementar uma classe parecida para conter estes valores. Agora você já tem condições de, pelo menos, declarar os métodos corretamente.</p>
<p><a href="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5rpbaYhmI/AAAAAAAAG5A/hm_OPBv5UP4/s1600-h/MetodosDeclarados.gif"><img style="text-align:center;width:320px;display:block;height:192px;cursor:hand;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5rpbaYhmI/AAAAAAAAG5A/hm_OPBv5UP4/s320/MetodosDeclarados.gif" border="0" alt="" /></a></p>
<p>Sua classe ainda não compila, pois ainda é necessário fazer a implementação dos métodos. A classe SoapHttpClientProtocol possui um facilitador: um método protected chamado Invoke que executa um método no WebService. Ele recebe como parâmetros uma string contendo o nome do método a ser invocado e um array de objects contendo tudo o que ele espera por parâmetros, e devolve um array de objects contendo todos os objetos da resposta. Segue a implementação:</p>
<p><a href="http://3.bp.blogspot.com/_8_W1k5F0DUg/Sn5uWN2yK5I/AAAAAAAAG5I/mkHlXCSLwgI/s1600-h/MetodosImplementados.gif"><img style="text-align:center;width:320px;display:block;height:241px;cursor:hand;margin:0 auto 10px;" src="http://3.bp.blogspot.com/_8_W1k5F0DUg/Sn5uWN2yK5I/AAAAAAAAG5I/mkHlXCSLwgI/s320/MetodosImplementados.gif" border="0" alt="" /></a></p>
<p>Estamos chegando perto de concluir nosso Proxy. Mas se você rodar ele agora ele ainda não vai funcionar. Primeiro por que você vai precisar setar a propriedade Url que está na classe base. Faça isso como quiser mas o mais indicado é criar um construtor que recupere este parâmetro de um arquivo de configuração. Como estamos apenas fazendo um exemplo, eu vou definir a Url no próprio código:</p>
<p><a href="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5vRvl_jGI/AAAAAAAAG5Q/yhy9mlhcnBM/s1600-h/Construtor.gif"><img style="text-align:center;width:320px;display:block;height:45px;cursor:hand;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5vRvl_jGI/AAAAAAAAG5Q/yhy9mlhcnBM/s320/Construtor.gif" border="0" alt="" /></a></p>
<p>O nosso compilador vai quebrar um galhão pra gente na hora de compilar o projeto, mas ele precisa de algumas orientações para fazer isso. A primeira delas vai na classe do proxy, que precisa de uma anotação com um atributo de Binding. O atributo em questão é o System.Web.Services.WebServiceBindingAttribute e os parâmetros necessários são Name, que pode ter qualquer valor que você quiser usar para identificá-lo, e Namespace, que <strong>precisa</strong> ser o mesmo namespace do wsdl.</p>
<p><a href="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5wRw9lmFI/AAAAAAAAG5Y/niCaOSj4mWo/s1600-h/ClassBinding.gif"><img style="text-align:center;width:320px;display:block;height:72px;cursor:hand;margin:0 auto 10px;" src="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5wRw9lmFI/AAAAAAAAG5Y/niCaOSj4mWo/s320/ClassBinding.gif" border="0" alt="" /></a></p>
<p>Por fim, os métodos também precisam ser decorados com um atributo, o<br />
System.Web.Services.Protocols.SoapDocumentMethodAttribute recebe como principal argumento a definição do método no namespace, para tanto você precisa colocar o namespace completo acompanhado de uma barra &#8220;/&#8221; e o nome do método.</p>
<p><a href="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn7VGljVmiI/AAAAAAAAG54/h_Sefgg4Pzg/s1600-h/MetodosDecorados.gif"><img style="text-align:center;width:320px;display:block;height:285px;cursor:hand;margin:0 auto 10px;" src="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn7VGljVmiI/AAAAAAAAG54/h_Sefgg4Pzg/s320/MetodosDecorados.gif" border="0" alt="" /></a></p>
<p>Os outros parametros para este atributo são RequestNamespace e ResponseNamespace, que recebem o mesmo valor de namespace do wsdl. Tudo isso precisa bater com os nomes dos schemas dentro do wsdl para que o proxy funcione.</p>
<p>Tá na hora de testar seu proxy:</p>
<p><a href="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn7VrlJzufI/AAAAAAAAG6A/qRfkcxJ5hbs/s1600-h/ConsoleApplication.gif"><img style="text-align:center;width:320px;display:block;height:106px;cursor:hand;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn7VrlJzufI/AAAAAAAAG6A/qRfkcxJ5hbs/s320/ConsoleApplication.gif" border="0" alt="" /></a></p>
<p><a href="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn7WS9H-S_I/AAAAAAAAG6I/An2xOlBk9cY/s1600-h/runningProgram.gif"><img style="text-align:center;width:320px;display:block;height:76px;cursor:hand;margin:0 auto 10px;" src="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn7WS9H-S_I/AAAAAAAAG6I/An2xOlBk9cY/s320/runningProgram.gif" border="0" alt="" /></a></p>
<p>A implementação do seu próprio Proxy faz com que você possa fazer o código dele integrado à sua solução e não isolado como normalmente acontece com os proxies construídos pelas ferramentas que os geram. Além de ficar mais limpo e flexível, contendo apenas o que você vai usar.</p>
<p>Se quiser saber mais sobre a estrutura e o conteúdo dos WSDL&#8217;s, segue uma documentaçãoi detalhada a respeito deles: <a href="http://www.w3.org/TR/wsdl">http://www.w3.org/TR/wsdl</a></p>
<p>Em breve, postarei as formas de reproduzir o mesmo feito no Web Service Enhancements, que atende especificações de extensão para os web services e também para o SoapToolKit. Até lá você pode se divertir praticando esta técnica com webservices mais complexos que recebem e devolvem objetos contendo outros objetos, ou lendo melhor a respeito dos outros derivados de WebClientProtocol, e de outros usos dos atributos WebServiceBindingAttribute e SoapDocumentMethodAttribute.</p>
<p>Até lá.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/halonfullestuse.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/halonfullestuse.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/halonfullestuse.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/halonfullestuse.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/halonfullestuse.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/halonfullestuse.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/halonfullestuse.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/halonfullestuse.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=halonfullestuse.wordpress.com&amp;blog=8957117&amp;post=8&amp;subd=halonfullestuse&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://halonfullestuse.wordpress.com/2009/08/11/8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>

		<media:content url="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5VdQR_amI/AAAAAAAAG4A/jaIkQjLwJA0/s320/NewProject.gif" medium="image" />

		<media:content url="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5Wl9EVCSI/AAAAAAAAG4I/ruRRhV10CmU/s320/NewClass.gif" medium="image" />

		<media:content url="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5ZzsT6u3I/AAAAAAAAG4Q/zYWRIpyLXaU/s320/Book.gif" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5b4Hehl-I/AAAAAAAAG4Y/zV6YvbiOyWQ/s320/Methods.gif" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5fnW1YjYI/AAAAAAAAG4g/yycZ6iuSIyE/s320/NewClientProject.gif" medium="image" />

		<media:content url="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5iISkvplI/AAAAAAAAG4o/3dj1ZIOeSmk/s320/wsdl.gif" medium="image" />

		<media:content url="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn5l12wInPI/AAAAAAAAG4w/Py4QIPzh52E/s320/Operations.gif" medium="image" />

		<media:content url="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn5p6cvSwxI/AAAAAAAAG44/pO9pa0wTX4w/s320/ComplexTypes.gif" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5rpbaYhmI/AAAAAAAAG5A/hm_OPBv5UP4/s320/MetodosDeclarados.gif" medium="image" />

		<media:content url="http://3.bp.blogspot.com/_8_W1k5F0DUg/Sn5uWN2yK5I/AAAAAAAAG5I/mkHlXCSLwgI/s320/MetodosImplementados.gif" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn5vRvl_jGI/AAAAAAAAG5Q/yhy9mlhcnBM/s320/Construtor.gif" medium="image" />

		<media:content url="http://1.bp.blogspot.com/_8_W1k5F0DUg/Sn5wRw9lmFI/AAAAAAAAG5Y/niCaOSj4mWo/s320/ClassBinding.gif" medium="image" />

		<media:content url="http://4.bp.blogspot.com/_8_W1k5F0DUg/Sn7VGljVmiI/AAAAAAAAG54/h_Sefgg4Pzg/s320/MetodosDecorados.gif" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn7VrlJzufI/AAAAAAAAG6A/qRfkcxJ5hbs/s320/ConsoleApplication.gif" medium="image" />

		<media:content url="http://2.bp.blogspot.com/_8_W1k5F0DUg/Sn7WS9H-S_I/AAAAAAAAG6I/An2xOlBk9cY/s320/runningProgram.gif" medium="image" />
	</item>
		<item>
		<title>10 Lições de Software de Mike de Libero</title>
		<link>http://halonfullestuse.wordpress.com/2009/08/11/10-licoes-de-software-de-mike-de-libero/</link>
		<comments>http://halonfullestuse.wordpress.com/2009/08/11/10-licoes-de-software-de-mike-de-libero/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 03:25:35 +0000</pubDate>
		<dc:creator>moreirayokoyama</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://halonfullestuse.wordpress.com/?p=6</guid>
		<description><![CDATA[Eu vi este artigo neste site: http://shapingsoftware.com/2009/07/20/lessons-in-software-from-mike-de-libero/ E resolvi dar uma traduzida por cima para compartilhar com todos, uma vez que todas as lições, até mesmo as que já são do conhecimento de todos, sempre são boas para ser relembradas. Lição 1: Todo Software é falho Lição 2: Faça o check-in com frequência Lição 3: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=halonfullestuse.wordpress.com&amp;blog=8957117&amp;post=6&amp;subd=halonfullestuse&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eu vi este artigo neste site: <a href="http://shapingsoftware.com/2009/07/20/lessons-in-software-from-mike-de-libero/">http://shapingsoftware.com/2009/07/20/lessons-in-software-from-mike-de-libero/</a></p>
<p>E resolvi dar uma traduzida por cima para compartilhar com todos, uma vez que todas as lições, até mesmo as que já são do conhecimento de todos, sempre são boas para ser relembradas.</p>
<p>Lição 1: Todo Software é falho</p>
<p>Lição 2: Faça o check-in com frequência</p>
<p>Lição 3: Testes, você tem que amá-los.</p>
<p>Lição 4: Refatore, faça o check-in e repita</p>
<p>Lição 5: Codificar é fácil, humanos é que são teimosos</p>
<p>Lição 6: Quanto mais olhos em seu código, melhor</p>
<p>Lição 7: Continue aprendendo e melhorando</p>
<p>Lição 8: Simples é belo</p>
<p>Lição 9: Aprenda desenvolvimento de software sem codificar</p>
<p>Lição 10: Pense no seu público</p>
<p><strong>Lição 1: Todo Software é falho<br />
</strong>Qualquer um que tenha escrito um software maior que &#8220;hello world&#8221; sabe que haverão bugs. Isto é um fato no desenvolvimento de software. Estas falhas ocorrem porque a forma em que um pedaço de software é escrito é um reflexo de como o desenvolvedor pensa e quais desafios ele ou ela está tentando resolver. O fato dos pensamentos humanos não serem logicamente perfeitos o tempo todo, erros irão ocorrer. Além disso, o desenvolvimento de software é sempre um conflito entre tempo/dinheiro e aspectos que levam a items deixados parcialmente codificados ou feitos às pressas. O que nos leva à próxima lição&#8230;</p>
<p><strong>Lição 2: Faça o check-in com frequência<br />
</strong>Todo mundo usa Source Control, certo? Se você não usa, comece agora. Quando estiver desenvolvendo software ou fazendo refactoring massivo, source control é seu amigo. Quanto mais frequênte você fizer check-ins em porções utilizáveis de código, mais fácil será para recuar se você tiver bagunçado completamente algo. Em equipes que requerem revisão de código antes do check-in ou eles congelam check-ins, crie um servidor de source control local. É muito fácil e rápido. Eu sempre penso no source control como um botão &#8220;desfazer&#8221; e ele libera parcialmente o desenvolvedor do medo de fazer uma bagunça publicamente. Se você usa source control e faz testes unitários, quase todo o medo vai embora.</p>
<p><strong>Lição 3: Testes, você tem que amá-los.<br />
</strong>Ahh Testes unitários&#8230; Todo mundo diz que você tem que usá-los e eles são a melhor coisa desde que criaram o pão pré-fatiado. Eu acabei concordando com a maior parte. Quando desenvolvo livremente (NT: O autor usou greenfield developement para se referir a desenvolmento à vontade, ou seja, da forma como ele bem entender, sem restrições) eu me certifico de que os testes unitários são sempre escritos e usados. Contudo, a idéia de testes unitários como parte do ciclo normal de desenvolvimento tem se tornado apenas semi-comum nos últimos 5 anos e bons softwares foram construídos antes deles. Manter uma lista de testes comuns que deveriam ser rodados fora de uma IDE também é algo muito bom de se ter. Eu acho que a maior vantagem dos testes unitários é que contanto que eles sejam rápidos ao rodar, eles permitem uma rápida verificação da sanidade do desenvolvedor. Se o source control é o botão &#8220;desfazer&#8221;, então testes unitários são a babá que te dá uma bronca por ter feito algo que você não faria se seus pais estivessem por perto.</p>
<p><strong>Lição 4: Refatore, faça o check-in e repita</strong><br />
Nenhuma porção de código é perfeita mas ela pode melhorar (e, claro, pode piorar) se você voltar ao código e fizer a si mesmo as perguntas &#8220;o que posso fazer para que isso fique mais curto, fácil de entender, etc&#8230;?&#8221; As pessoas fazem isso o tempo todo quando escrevem textos mas não acontece o mesmo quando escrevem código. Depois de cada intervalo, faça o check-in no código no caso de você ir muito longe e ter removido algum porção necessária de código. Dependendo do tamanho do código sendo refatorado poderão haver muitas iterações.</p>
<p><strong>Lição 5: Codificar é fácil, humanos é que são teimosos</strong><br />
Não me leve a mal, existem alguns problemas difíceis na codificação mas eles não são tão difíceis quanto descobrir o que nosso companheiro quis fazer quando escreveu uma porção de código. Humanos tem uma tendência para serem inconstantes e contradizerem o que eles dizem. No topo disto é muito difícil se comunicar claramente e existe uma barreira entre discurso de nerd (NT: aqui o autor usou o termo geek-speak para se referir ao vocabulário normalmente usado num diálogo de programadores) e o vocabulário normal. Isto torna xtremamente difícil descobrir o que os usuários estão pedindo.</p>
<p><strong>Lição 6: Quanto mais olhos em seu código, melhor</strong><br />
Toda vez que inicio uma nova base de código, ou volto para uma que não tenho usado por algumas semanas eu sempre gasto alguns minutos navegando em busca de coisas a melhorar. Quando eu encontro algo que foi uma má implementação ou apenas um bug eu mando um email para o desenvolvedor dizendo como aquilo poderia ser melhorado (eu também mudo a implementação para fazê-la melhor). Eu peço e espero que a mesma coisa de qualquer desenvolvedor que trabalhe comigo. Porque? Porque isso nos faz honestos e nos ensina maneiras de fazer nossos programas melhores. Claro, isto pode não ser como &#8220;sentarmos juntos e revisarmos o código&#8221;, mas eu acho que isto funciona bem no mínimo para pequenas equipes. Code-reviews formais são bons e possuem um objetivo similar: Maior qualidade no código e os bugs são encontrados antes que o QA os encontre. Eu acho que tudo depende do ambiente em que você está.</p>
<p><strong>Lição 7: Continue aprendendo e melhorando</strong><br />
A lição parece óbvia mas precisa ser dita. Se você não aprender e/ou continuar melhorando você corre o risco de se tornar um obsoleto (NT: aqui o autor usou a palavra &#8220;fez&#8221; que se refere a um chapéu pouco usado atualmente no Marrocos e na Turquia, mas que já foi amplamente usado pela população destes países durante muito tempo), o que eu duvido que alguém queira. Minhas métricas normalmente são:</p>
<p>* Que novas linguagens / tecnologias / técnicas eu aprendi no último mês?</p>
<p>* Quando eu olho para o meu código antigo, eu consigo encontrar melhores maneiras para fazer as coisas?</p>
<p>Eu acho que a segunda métrica é muito importante. Se você não consegue pensar em maneiras de melhorar o código &#8211; ainda que não seja praticável na base de código atual &#8211; então você deveria se preocupar como se isso fôsse um sinal de que você não está crescendo.</p>
<p><strong>Lição 8: Simples é belo</strong><br />
O acrônimo KISS (Keep It Simple, Stupid) é muito bom e eu tento seguí-lo quando estou desenvolvendo software desde que eu também acredite na idéia de que conforme o software cresce ele se torna mais complexo. Toda vez que eu tiver que corrigir uma questão ou escrever código eu sempre me pergunto &#8220;isso não pode ser mais simples?&#8221; Simplicidade tem muitos benefícios e não só de uma perspectiva de desenvolvimento. Alguns são:</p>
<p>* Código fica mais fácil de entender<br />
* Manutenção tende a ser mais fácil<br />
* UI (interface com o usuário &#8211; telas) simples tende a fazer os programas mais fácil de usar</p>
<p><strong>Lição 9: Aprenda desenvolvimento de software sem codificar</strong><br />
Particularmente eu faço uma distinção entre codificar e realmente desenvolver software. Eu acho que existem muitíssimas pessoas que focam somente na porção de codificação e não para o panorama mais amplo da figura. Muitas pessoas podem escrever código mas parece que poucas conseguem desenhar um sistema, testar um sistema, escrever o código, documentar a arquitetura, falar com os usuários para descobrir os requisitos, criar estimativas semi-precisas, ajudar outros membros da equipe e, quando desenhar a interface com o usuário, saber o básico da iteração com o mesmo. Existem coisas que todos os desenvolvedores deveriam saber sobre codificação também, mas eu sinto que melhorar e refinar seu código é bem fácil e é feito conforme você desenvolve software. Aprender e melhorar em relação ao desenvolvimento de software não é necessariamente o suficiente para manter alguém em uma vaga de programador.</p>
<p><strong>Lição 10: Pense no seu público</strong><br />
Quando chegar neste ponto você vai pensar imediatamente nos usuários do programa para os quais ele está sendo criado, não é? Se você pensou você esqueceu uma porção de outros públicos <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Toda vez que você codifica eu acho que existem pelo menos 4 públicos: O compilador, os outros programadores / você mesmo no futuro, hackers e usuários maliciosos e então os usuários do programa. Todos estes públicos requerem diferentes coisas e o público mais fácil de satisfazer é o compilador. Os outros públicos dão um pouco mais e trabalho quando se cria software. Por exemplo, o público de hackers nós queremos mesmo é chatear invés de agradar e chatear um hacker é bem fácil simplesmente não confiando na entrada de dados e devidamente encriptando a saída (nota: isto não vai te proteger de tudo no arsenal de um hacker mas vai tomar cuidado com uma porção enorme deles). O públic de desenvolvedores é bem teimoso conforme nós temos uma tendência de achar que todo código de outro programador é estúpido ou pelo menos ter uma opinião sobre ele, isso se baseia na diferença em como cada pessoa pensa (pelo menos esta é minha opinião). Commentando regras de negócio, escrevendo código limpo e claro e mantendo-o simples normalmente ajuda o público desenvolvedor. Para os verdadeiros usuários do programa, eles são um grupo interessante. Existem muitos livros sobre usabilidade e design então eu estou apenas sugerindo que você pegue alguns livros bons nesse quesito (se você precisar de alguma sugestão, sinta-se livre para me contactar [NT: Quem faz o convite é o autor, eu, o tradutor, não conheço nenhum livro bom a este respeito, embora tenha muito interesse em obter).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/halonfullestuse.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/halonfullestuse.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/halonfullestuse.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/halonfullestuse.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/halonfullestuse.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/halonfullestuse.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/halonfullestuse.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/halonfullestuse.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=halonfullestuse.wordpress.com&amp;blog=8957117&amp;post=6&amp;subd=halonfullestuse&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://halonfullestuse.wordpress.com/2009/08/11/10-licoes-de-software-de-mike-de-libero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c188c321d553a2ac5efb5e4c05df9354?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">moreirayokoyama</media:title>
		</media:content>
	</item>
	</channel>
</rss>
