<?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>Idéias para arquitetura e desenvolvimento de soluções</title>
	<atom:link href="http://flaviomoraes.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://flaviomoraes.wordpress.com</link>
	<description>Um espaço para discursão de novas tecnologias e maneiras de utilizá-las</description>
	<lastBuildDate>Tue, 21 Jun 2011 22:30:54 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='flaviomoraes.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Idéias para arquitetura e desenvolvimento de soluções</title>
		<link>http://flaviomoraes.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://flaviomoraes.wordpress.com/osd.xml" title="Idéias para arquitetura e desenvolvimento de soluções" />
	<atom:link rel='hub' href='http://flaviomoraes.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Transações Distribuídas no WCF</title>
		<link>http://flaviomoraes.wordpress.com/2010/07/26/transacoes-distribuidas-no-wcf/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/07/26/transacoes-distribuidas-no-wcf/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 22:29:01 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[MSMQ]]></category>
		<category><![CDATA[Persistência de Dados]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=487</guid>
		<description><![CDATA[Olá a todos, Nesse post vamos demonstrar como podemos ter transações distribuídas utilizando serviços WCF sendo propagadas para chamadas de diversos métodos que podem pertencer a diferentes serviços. Esse cenário pode ser desenvolvido utilizando dois modelos: um proprietário do WCF &#8230; <a href="http://flaviomoraes.wordpress.com/2010/07/26/transacoes-distribuidas-no-wcf/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=487&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>Nesse post vamos demonstrar como podemos ter transações distribuídas utilizando serviços WCF sendo propagadas para chamadas de diversos métodos que podem pertencer a diferentes serviços. Esse cenário pode ser desenvolvido utilizando dois modelos: um proprietário do WCF para situações onde existirão somente serviços construídos nessas tecnologia e outro utilizando o protocolo WS-AT (WS Atomic Transaction), que é um protocolo de controle de transações compatível com diversas tecnologias para desenvolvimento de webservices.</p>
<p>A estrutura de transação do WCF (para os dois tipo de protocolos citados acima) utiliza o modelo presente a partir do .Net Framework 2.0, onde temos dois tipos de objetos: Transacion e TransactionScope. Nesse modelo de programação o desenvolvedor normalmente lida com o objeto TransactionScope pois a duração da transação e as operações transacionadas são determinadas pela vida desse tipo de objeto. Temos nesse tipo de objeto três propriedades básicas que podem ser configuradas: seu período de timeout (TransactionTimeout), seu nível de isolamento (TransactionIsolationLevel) e se ela será confirmada automaticamente ou não (TransactionAutoCompleteOnSessionClose).</p>
<p>Para um método de um serviço WCF pertencer a uma transação ele deve ser decorado com o atributo TransactionFlow, onde deve ser informado a obrigatoriedade ou não da transação. Essa configuração é informada a partir de um parâmetro, que pode assumir três valores diferentes, passado para o atributo. O valor Allowed indica que um método pode ou não pertencer a uma transação, desse modo quando a chamada desse método pertencer a uma transação as operações realizadas por ele também estarão no contexto da transação. Porém se a chamada não pertencer a uma transação o método será executado com suas operações não transacionadas. O valor NotAllowed informa que o método não será executado em contexto de transação, ou seja, mesmo que a chamada possua uma transação ativa as operações realizadas pelo método com esse valor não estarão no contexto dessa transação nem de qualquer outra. Por último o valor Mandatory obriga o método a possuir uma transação. Nessa configuração caso a chamada não possua uma transação ativa será iniciada uma nova transação com o escopo desse método.</p>
<p>Passaremos agora para o desenvolvimento do nosso exemplo. Nele teremos dois serviços WCF onde cada um possuirá um método que pode ser chamado no contexto de uma transação. Um dos métodos faz a inserção em um banco de dados enquanto o outro enviará uma mensagem para uma fila MSMQ. Demonstraremos então o funcionamento da transação distribuída utilizando mais de um recurso. Começaremos então criando uma fila transacional no MSMQ e uma tabela em um banco de dados no SQL Server.</p>
<div id="attachment_488" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional1.png"><img class="size-medium wp-image-488" title="WCFTransacional1" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional1.png?w=300&#038;h=123" alt="" width="300" height="123" /></a><p class="wp-caption-text">Codigo para gerar a tabela utilizada no exemplo</p></div>
<p>O próximo passo é construir a estrutura para o código que será composta de um Windows Service para hospedar os serviços WCF e de uma aplicação do tipo Console que será o iniciador das chamadas, controlando a transação. Adicionados esses projetos na solução adicione dois serviços WCF no projeto do Windows Service e faça <a href="http://flaviomoraes.wordpress.com/2009/09/20/cenarios-wcf-expondo-regras-de-negocio-atraves-de-servicos/">as alterações necessárias nesse projeto para subir os serviços</a>. Nesse exemplo as configurações serão controladas a partir do arquivo app.config dos projetos.</p>
<div id="attachment_489" class="wp-caption aligncenter" style="width: 223px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional2.png"><img class="size-medium wp-image-489" title="WCFTransacional2" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional2.png?w=213&#038;h=300" alt="" width="213" height="300" /></a><p class="wp-caption-text">Estrutura da solucao</p></div>
<p>Adicionados os dois serviços WCF no projeto do Windows Service vamos iniciar as configurações para que eles suportem chamadas em contexto de transação. O primeiro item a ser alterado é o contrato de cada serviço. Nele será adicionado o atributo TransactionFlow na definição do método, especificando o seu suporte a transações. Essa alteração deve ser realizada para os contratos dos dois serviços.</p>
<div id="attachment_490" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional3.png"><img class="size-medium wp-image-490" title="WCFTransacional3" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional3.png?w=300&#038;h=86" alt="" width="300" height="86" /></a><p class="wp-caption-text">Codigo do contrato do primeiro servico</p></div>
<p>Após a alteração dos dois contratos devemos modificar também o código da sua implementação, adicionando o atributo TransactionScopeRequired para o método.</p>
<div id="attachment_491" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional4.png"><img class="size-medium wp-image-491" title="WCFTransacional4" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional4.png?w=300&#038;h=105" alt="" width="300" height="105" /></a><p class="wp-caption-text">Codigo inicial do metodo do segundo servico</p></div>
<p>Basta agora alterarmos o arquivo app.config do Windows Service para termos nossos serviços WCF suportando transações. Nessa configuração será alterada a configuração do binding, passando o valor do atributo transactionFlow como true e informando essa configuração nos endpoints:</p>
<div id="attachment_492" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional5.png"><img class="size-medium wp-image-492" title="WCFTransacional5" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional5.png?w=300&#038;h=160" alt="" width="300" height="160" /></a><p class="wp-caption-text">Modificacoes no arquivo de configuracao</p></div>
<p>Vamos então terminar o código dos serviços, onde o primeiro fará a inserção no banco de dados e o segundo enviará uma mensagem para o MSMQ, ambos no contexto de uma transação:</p>
<div id="attachment_493" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional6.png"><img class="size-medium wp-image-493" title="WCFTransacional6" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional6.png?w=300&#038;h=249" alt="" width="300" height="249" /></a><p class="wp-caption-text">Codigo para enviar a mensagem em contexto de transacao</p></div>
<div id="attachment_494" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional7.png"><img class="size-medium wp-image-494" title="WCFTransacional7" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional7.png?w=300&#038;h=239" alt="" width="300" height="239" /></a><p class="wp-caption-text">Codigo para inserir o registro na tabela</p></div>
<p>Passaremos agora a desenvolver a chamada da aplicação que inicia essa transação. Nesse exemplo utilizamos um projeto do tipo Console Application, porém outros tipos de projetos podem ser utilizados. O primeiro passo é gerar os proxies dos serviços, para isso podemos iniciar a versão de Debug do Windows Service a partir de uma linha de comando, solicitando ao Visual Studio a geração dos proxies dos dois serviços. Após gerados os proxies basta criar um objeto do tipo TransactionScope e realizar as chamadas dos serviços durante o seu ciclo de vida, como demonstrado abaixo:</p>
<div id="attachment_495" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional8.png"><img class="size-medium wp-image-495" title="WCFTransacional8" src="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional8.png?w=300&#038;h=176" alt="" width="300" height="176" /></a><p class="wp-caption-text">Codigo da aplicacao que controla a transacao</p></div>
<p>Temos então nosso exemplo pronto. Podemos iniciar o Windows Service para abrir os serviços. Em seguida execute a aplicação que inicia a transação e realiza as chamadas. Poderemos ver que ao final da execução será adicionado um registro na tabela e será enviada a mensagem para a fila. Vamos agora retirar o comentário da linha de código na aplicação console para forçar o disparo de uma exceção com o intuito de forçar o rollback da transação. Ao executar todo o ciclo novamente veremos que a exceção foi disparada e não foi incluído o registro na tabela nem enviada a mensagem para a fila. Como sempre adicionei o exemplo no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a> com o nome WCF_Transacional.</p>
<p>Abraços a todos e até o próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/487/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/487/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/487/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/487/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/487/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/487/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/487/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/487/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=487&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/07/26/transacoes-distribuidas-no-wcf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional1.png?w=300" medium="image">
			<media:title type="html">WCFTransacional1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional2.png?w=213" medium="image">
			<media:title type="html">WCFTransacional2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional3.png?w=300" medium="image">
			<media:title type="html">WCFTransacional3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional4.png?w=300" medium="image">
			<media:title type="html">WCFTransacional4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional5.png?w=300" medium="image">
			<media:title type="html">WCFTransacional5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional6.png?w=300" medium="image">
			<media:title type="html">WCFTransacional6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional7.png?w=300" medium="image">
			<media:title type="html">WCFTransacional7</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/07/wcftransacional8.png?w=300" medium="image">
			<media:title type="html">WCFTransacional8</media:title>
		</media:content>
	</item>
		<item>
		<title>Montando relacionamentos no App Engine: Um para muitos</title>
		<link>http://flaviomoraes.wordpress.com/2010/05/24/montando-relacionamentos-no-app-engine-um-para-muitos/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/05/24/montando-relacionamentos-no-app-engine-um-para-muitos/#comments</comments>
		<pubDate>Tue, 25 May 2010 00:07:00 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[Acesso a dados]]></category>
		<category><![CDATA[App Engine]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Persistência de Dados]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Storage]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=481</guid>
		<description><![CDATA[Olá a todos,                 Nesse post falaremos mais um pouco sobre o mecanismo de armazenamento de dados do App Engine. Demonstraremos como montar relacionamentos do tipo “um para muitos” nessa estrutura de armazenamento. Primeiro precisamos lembrar que o mecanismo do &#8230; <a href="http://flaviomoraes.wordpress.com/2010/05/24/montando-relacionamentos-no-app-engine-um-para-muitos/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=481&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>                Nesse post falaremos mais um pouco sobre o mecanismo de armazenamento de dados do App Engine. Demonstraremos como montar relacionamentos do tipo “um para muitos” nessa estrutura de armazenamento. Primeiro precisamos lembrar que o mecanismo do App Engine não é uma base de dados relacional, portanto precisamos pensar de uma maneira diferente quanto projetamos nossa estrutura de dados.</p>
<p>                Numa base de dados relacional temos cada entidade representada por uma tabela e os relacionamentos são dados por chaves primárias e estrangeiras. Num relacionamento do tipo “um para muitos”, onde temos um “pai” para muitos “filhos” temos na tabela “filho” um ou mais campos que compõem a chave estrangeira. Essa chave então aponta para os campos que compõem a chave primária no registro na tabela “pai”. Portanto o relacionamento é montado através de relacionamento entre os campos dos registros. Um ponto importante é que cada entidade permanece separada em uma tabela.</p>
<p>                Já na base de dados do App Engine temos uma estrutura orientada a objetos. Nesse tipo de base de dados as entidades são representadas por classes, que são as mesmas utilizadas no código do aplicativo. Portanto os relacionamentos entre os objetos são montados de outra maneira. Num relacionamento do tipo “um para muitos” o objeto “pai” contém os objetos “filhos” que podem estar organizados em arrays ou listas dinâmicas.</p>
<p>                Vamos então passar para o exemplo para deixar essas idéias mais claras. O primeiro passo é criar o projeto no eclipse. Nesse post utilizaremos um projeto do App Engine sem o uso do GWT. Esse projeto seguirá a sugestão do Rodrigo Monteiro feita em um comentário do post anterior. Porém alterei o tipo de relacionamento de “um para um” para “um para muitos”.</p>
<p>                Criado o projeto temos que definir nossa estrutura de dados, que será composta por um conjunto de classes. A classe “pai” representará livros, enquanto a classe “filho” serão os capítulos desse livro (na sugestão do Rodrigo a classe pai era Departamento e a classe filho Funcionario). Para montar o relacionamento entre o livro e seus capítulos (um livro para N capítulos) deveremos criar uma lista da classe capítulos na classe livro. Porém para permitir a identificação do relacionamento entre as classes pelo mecanismo de armazenamento deveremos criar uma propriedade do tipo livro na classe capitulo. O relacionamento é estabelecido ao utilizarmos o parâmetro <em>mappedBy</em> do atributo <em>Element</em> na propriedade da classe “pai” que representa seus filhos, ou seja, na lista de capitulos. Esse parâmetro recebe uma string que é o nome da propriedade que armazena o objeto “pai” no “filho”. A implementação dessa estrutura pode ser vista na figurar abaixo:</p>
<div id="attachment_482" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_1.jpg"><img class="size-medium wp-image-482" title="um_muitos_1" src="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_1.jpg?w=300&#038;h=116" alt="" width="300" height="116" /></a><p class="wp-caption-text">Codigo das classes que serao persistidas no App Engine</p></div>
<p>                Podemos então passar para a criação e armazenamento dos objetos. Para demonstrar vamos criar um objeto do tipo livro e adicionarmos nele alguns objetos do tipo capitulo. Após adicionarmos os objetos “filhos” no objeto “pai” devemos utilizar a classe PersistenceManager para persistir a classe “pai”. Nesse tipo de relacionamento não é necessário persistir as classes filhos, pois elas já serão persistidas junto com a classe “pai”. O código para realizar essa tarefa é semelhante ao abaixo:</p>
<div id="attachment_483" class="wp-caption aligncenter" style="width: 272px"><a href="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_2.jpg"><img class="size-medium wp-image-483" title="um_muitos_2" src="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_2.jpg?w=262&#038;h=300" alt="" width="262" height="300" /></a><p class="wp-caption-text">Codigo para gravar os objetos no storage</p></div>
<p>                Podemos realizar as pesquisas a partir da classe “pai” ou pela classe “filho”, porém não podemos utilizar atributos da classe “filho” quando nossa consulta parte da classe “pai”. Abaixo temos um exemplo de como realizar a pesquisa nessa estrutura de dados:</p>
<div id="attachment_484" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_3.jpg"><img class="size-medium wp-image-484" title="um_muitos_3" src="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_3.jpg?w=300&#038;h=135" alt="" width="300" height="135" /></a><p class="wp-caption-text">Codigo para realizar a pesquisa</p></div>
<p>                Temos então um exemplo de relacionamento “um para muitos” no App Engine. Um ponto importante é primeiro projetarmos as classes para somente depois começarmos a utilizá-las. Como sempre deixei o código utilizado para construir o post no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky drive</a>, com o nome testeJDO.zip.</p>
<p>Abraços a todos e até o próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/481/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/481/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/481/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=481&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/05/24/montando-relacionamentos-no-app-engine-um-para-muitos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_1.jpg?w=300" medium="image">
			<media:title type="html">um_muitos_1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_2.jpg?w=262" medium="image">
			<media:title type="html">um_muitos_2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/05/um_muitos_3.jpg?w=300" medium="image">
			<media:title type="html">um_muitos_3</media:title>
		</media:content>
	</item>
		<item>
		<title>Armazenando dados no App Engine</title>
		<link>http://flaviomoraes.wordpress.com/2010/04/07/armazenando-dados-no-app-engine/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/04/07/armazenando-dados-no-app-engine/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 00:09:56 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[Acesso a dados]]></category>
		<category><![CDATA[App Engine]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[desenvolvimento]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=478</guid>
		<description><![CDATA[Olá a todos,                 Em outros posts sobre o App Engine mostramos como desenvolver a camada de apresentação com o uso de páginas JSP ou com o Framework GWT. Também já fizemos um teste simples construindo uma regra de negócio &#8230; <a href="http://flaviomoraes.wordpress.com/2010/04/07/armazenando-dados-no-app-engine/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=478&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>                Em outros posts sobre o App Engine mostramos como desenvolver a camada de apresentação com o uso de páginas JSP ou com o Framework GWT. Também já fizemos um teste simples construindo uma regra de negócio no lado Server, que comunica com a camada de apresentação através do protocolo RPC, que é proprietário do GWT. Por fim fizemos nossa primeira integração entre plataformas comunicando a camada de apresentação, desenvolvida com o uso do GWT, com um serviço WCF através do protocolo REST utilizando o formato JSON.</p>
<div id="attachment_473" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/04/arquitetura.jpg"><img class="size-medium wp-image-473" title="arquitetura" src="http://flaviomoraes.files.wordpress.com/2010/04/arquitetura.jpg?w=300&#038;h=153" alt="" width="300" height="153" /></a><p class="wp-caption-text">Arquitetura com os assuntos demonstrado ate o momento</p></div>
<p>                Entretanto até o momento não tínhamos abordado a camada de persistência. Esse será o assunto desse post, onde veremos como podemos gravar as informações de nossos sistemas no Data Storage do App Engine. Para manipular os dados armazenados nesse Data Storage temos duas opções: podemos utilizar APIs de baixo nível diretamente ou através da biblioteca JDO. Como esse é o primeiro post em que abordamos o assunto utilizaremos a biblioteca JDO.</p>
<p>                O App Engine Data Storage é um mecanismo que nos permite gravar os dados de forma estruturada. A estrutura dos dados é definida através de classes, portanto o Data Storage não é um banco de dados relacional. Porém podemos utilizar comandos de pesquisa muito semelhantes ao transact SQL para realizar pesquisas nessa base de dados. Na verdade esse mecanismo de persistência de dados é muito semelhante às tables do Windows Azure Data Storage e ao banco de dados Caché.</p>
<p>               A principal vantagem do App Engine Data Storage em relação ao mecanismo do Windows Azure é a possibilidade de aninharmos tipos de dados. Assim no App Engine podemos criar uma classe, que define uma estrutura de dados, onde algumas de suas propriedades podem ser outras classes que também definem estruturas de dados do Data Storage. Para exemplificar: podemos criar uma classe (estrutura) endereço e utilizá-la como propriedade em outra classe, que seria do tipo pessoa. A classe pessoa poderia também possuir uma lista (List) de endereços. Desse modo podemos utilizar o Data Storage do App Engine como um banco de dados hierárquico preparado para lidar com altíssimo volume de acessos.</p>
<p>                Nosso exemplo será um cadastro de logins, com os campos login e senha. Alteraremos uma tela já utilizada na nossa prova de conceito adicionando os controles necessários para esse exemplo.</p>
<p>               A primeira tarefa que devemos realizar é definir nossa estrutura de dados através de uma classe. Essa classe deverá ser criada na subpasta client (lembre-se que estamos utilizando o GWT). Para indicar que essa classe será utilizada pelo JDO devemos decorá-la com o atributo PersistenceCapable. Além disso devemos decorar com o atributo Persistent cada variável membro dessa classe que desejamos persistir no Data Storage.</p>
<div id="attachment_474" class="wp-caption aligncenter" style="width: 260px"><a href="http://flaviomoraes.files.wordpress.com/2010/04/estrutura-dado.jpg"><img class="size-medium wp-image-474" title="estrutura dado" src="http://flaviomoraes.files.wordpress.com/2010/04/estrutura-dado.jpg?w=250&#038;h=300" alt="" width="250" height="300" /></a><p class="wp-caption-text">Classe que define a estrutura dos dados que serao gravados</p></div>
<p>               Toda classe definida como uma estrutura de dados do Data Storage deve possuir um campo de identificador único, semelhante à uma primary key em um banco de dados relacional. Porém a variável membro que será o identificador único deverá ser decorada com o atributo PrimaryKey. Nesse ponto temos duas observações importantes. Primeiro, por limitação do GWT para utilizarmos a passagem de objetos entre as camadas (client e Server) o tipo de dado da variável que será a primary key não poderá deverá ser do tipo Key. Segundo, esse campo não poderá ser um tipo nativo, como string ou long, mas sim classes que representem esses tipos como String ou Long.</p>
<p>               O próximo passo será alterar a tela adicionando os controles para permitir a pesquisa e inclusão dos dados. Incluiremos um botão para realizar a pesquisa e outro botão para gravar um novo login ou atualizar algum já existente. Deverão ser adicionados caixas de texto para que possamos digitar o login e senha que serão gravados e uma tabela que exibirá os logins já criados.</p>
<p>                A terceira etapa é escrevermos a classe que faz o uso do JDO. Como estamos utilizando o Eclipse com o plugin do App Engine as configurações no projeto para utilizarmos o JDO já estão preparadas para nós. Caso necessite ou queira saber como realizar as configurações pode ser vista <a href="http://code.google.com/intl/pt-BR/appengine/docs/java/gettingstarted/usingdatastore.html">aqui</a>. A comunicação com o JDO é realizada através de objetos do tipo PersistenceManager, que são criados através do objeto PersistenceManagerFactory. Porém o objeto do tipo PersistenceManagerFactory demanda um tempo razoável para criá-lo, em contrapartida precisamos somente de uma instância dele para todo o projeto. Portanto podemos encapsular esse objeto em um classe, que deverá ser criada na subpasta Server, modificada com o atributo final para termos somente uma instância dessa classe na memória do nosso processo.</p>
<div id="attachment_475" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/04/classpmf.jpg"><img class="size-medium wp-image-475" title="classPMF" src="http://flaviomoraes.files.wordpress.com/2010/04/classpmf.jpg?w=300&#038;h=138" alt="" width="300" height="138" /></a><p class="wp-caption-text">Classe para recuperar os objetos do tipo PersistenceManager</p></div>
<p>               A última etapa é escrevermos o código para gravar e pesquisar os dados no Data Storage. Para gravarmos um novo dado devemos criar uma nova instância da classe e atribuir valores às suas propriedades. Em seguida temos que obter uma instância da classe PersistenceManager para em seguida gravarmos os dados através do método makePersistent desse objeto. A atualização de dados deve ser realizada com o mesmo método, porém utilizando uma instância recuperada do Data Storage.</p>
<div id="attachment_476" class="wp-caption aligncenter" style="width: 276px"><a href="http://flaviomoraes.files.wordpress.com/2010/04/gravar.jpg"><img class="size-medium wp-image-476" title="gravar" src="http://flaviomoraes.files.wordpress.com/2010/04/gravar.jpg?w=266&#038;h=300" alt="" width="266" height="300" /></a><p class="wp-caption-text">Codigo para gravar os dados no Data Storage</p></div>
<p>               Para pesquisarmos os dados no Data Storage precisamos montar uma query de pesquisa semelhante a uma query transact SQL, porém utilizamos nome de classes no lugar de nome de tabelas. Deveremos então obter uma instância da classe PersistenceManager e executarmos o método newQuery, passando como parâmetro a query. O retorno será uma lista (List) do tipo de objeto que define a estrutura dos dados.</p>
<div id="attachment_477" class="wp-caption aligncenter" style="width: 293px"><a href="http://flaviomoraes.files.wordpress.com/2010/04/pesquisa.jpg"><img class="size-medium wp-image-477" title="pesquisa" src="http://flaviomoraes.files.wordpress.com/2010/04/pesquisa.jpg?w=283&#038;h=300" alt="" width="283" height="300" /></a><p class="wp-caption-text">Codigo para pesquisar os dados no Data Storage</p></div>
<p>               Restará apenas escrever o código para realizar a chamada dos métodos do lado Server, conforme já demonstrado em <a href="http://flaviomoraes.wordpress.com/2010/01/31/app-engine-construindo-o-lado-server-com-o-auxilio-do-gwt/">outro post</a>. Poderemos então gravar novos dados e pesquisar os dados já existentes. Temos então um exemplo simples de como gravar e pesquisar dados no mecanismo de persistência do App Engine. Demonstramos também como trafegar objetos complexos entre as camadas do GWT. O código-fonte utilizado nesse post está disponibilizado no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a> com o nome <em>POCAppEngine JDO.zip</em>.</p>
<p>Abraço a todos e até o próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/478/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/478/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/478/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=478&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/04/07/armazenando-dados-no-app-engine/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/04/arquitetura.jpg?w=300" medium="image">
			<media:title type="html">arquitetura</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/04/estrutura-dado.jpg?w=250" medium="image">
			<media:title type="html">estrutura dado</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/04/classpmf.jpg?w=300" medium="image">
			<media:title type="html">classPMF</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/04/gravar.jpg?w=266" medium="image">
			<media:title type="html">gravar</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/04/pesquisa.jpg?w=283" medium="image">
			<media:title type="html">pesquisa</media:title>
		</media:content>
	</item>
		<item>
		<title>Integrando o App Engine (GWT) com serviços WCF</title>
		<link>http://flaviomoraes.wordpress.com/2010/03/29/integrando-o-app-engine-gwt-com-servicos-wcf/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/03/29/integrando-o-app-engine-gwt-com-servicos-wcf/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 00:43:40 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[App Engine]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows Azure]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=467</guid>
		<description><![CDATA[Olá a todos                 No último post (a muito tempo atrás) demonstramos como utilizar o protocolo REST junto com o formato JSON para realizar a comunicação entre a camada de apresentação em Silverlight e serviços WCF. Naquele post ficamos restritos &#8230; <a href="http://flaviomoraes.wordpress.com/2010/03/29/integrando-o-app-engine-gwt-com-servicos-wcf/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=467&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="mceTemp mceIEcenter">
<p style="text-align:left;">Olá a todos</p>
<p style="text-align:left;">                No último <a href="http://flaviomoraes.wordpress.com/2010/02/26/wcf-silverlight-utilizando-rest-e-json-em-servicos/">post</a> (a muito tempo atrás) demonstramos como utilizar o protocolo REST junto com o formato JSON para realizar a comunicação entre a camada de apresentação em Silverlight e serviços WCF. Naquele post ficamos restritos na plataforma Microsoft.</p>
<p style="text-align:left;">                A partir desse post vamos fazer algo um pouco diferente. Começaremos a partir de agora com o desenvolvimento de integrações entre plataformas. Nesse post faremos a integração entre a plataforma Microsoft e a plataforma App Engine através do protocolo REST.</p>
<p style="text-align:left;">Teremos então na plataforma Microsoft um serviço WCF que utiliza o protocolo REST e que expõem suas respostas no formato JSON. Utilizaremos nesse exemplo o serviço desenvolvido no <a href="http://flaviomoraes.wordpress.com/2010/02/26/wcf-silverlight-utilizando-rest-e-json-em-servicos/">último post</a>. Já na plataforma App Engine utilizaremos a camada de apresentação desenvolvida em JAVA com o framework GWT. Outro ponto que testaremos é a integração <em>on premise</em> com <em>on the cloud</em>, pois o serviço WCF ficará em um servidor local (on premise) enquanto a camada de apresentação será construída para ser hospedada no data Center da Google.</p>
<p style="text-align:left;">                Como utilizaremos o serviço criado em outro post não descreveremos sua construção. Também aproveitaremos o exemplo sobre GWT desenvolvido em <a href="http://flaviomoraes.wordpress.com/2010/01/31/app-engine-construindo-o-lado-server-com-o-auxilio-do-gwt/">outro post</a> para focarmos na integração das plataformas com o uso de REST e JSON. Assim passaremos direto para as alterações na camada de apresentação.</p>
<p style="text-align:left;">                Primeiro devemos adicionar um botão na tela para disparar a requisição ao serviço. Ele será adicionado na tela principal do exemplo sobre GWT (classe MainPanel.java). Devemos então declarar esse botão como variável membro da classe, além de configurar suas propriedades e adicionar o handler de click. Não esqueça também de adicionar esse botão no painel.</p>
</div>
<div class="mceTemp mceIEcenter" style="text-align:left;">
<div id="attachment_468" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt11.jpg"><img class="size-medium wp-image-468" title="WCF_GWT1" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt11.jpg?w=300&#038;h=219" alt="" width="300" height="219" /></a><p class="wp-caption-text">Adicionando o botao para disparar a requisicao ao servico</p></div>
<p>                O evento associado ao click do mouse dispara nesse exemplo um método chamado RealizaRequisicao, que é um método membro da classe MainPanel.java. Como o nome desse método diz ele realizará a requisição ao serviço WCF e tratará o retorno dessa requisição. A primeira etapa para a chamada do serviço é formar o endereço da requisição. Lembre que utilizamos o protocolo REST, logo todos os parâmetros serão passados no endereço. Nesse ponto é importante utilizarmos o método Encode da classe URL para realizar a troca de caracteres especiais (como acentos) pelos respectivos códigos para a requisição funcionar corretamente.</p>
<p>                Formado o endereço devemos utilizar um objeto da classe RequestBuilder para enviar a requisição ao serviço WCF. Ao realizar a requisição devemos informar um método de callback para ser disparado quando a resposta dessa requisição retornar. Esse método deve possuir dois eventos: onResponseReceive, que será disparado quando a requisição retornar com sucesso, e onError, que será disparado quando ocorrer um erro na requisição.</p>
<div id="attachment_469" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt21.jpg"><img class="size-medium wp-image-469" title="WCF_GWT2" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt21.jpg?w=300&#038;h=246" alt="" width="300" height="246" /></a><p class="wp-caption-text">Estrutura inicial do metodo que realiza a requisicao ao servico</p></div>
<p>                Vamos focar agora no evento onResponseReceive, mostrando como realizar o tratamento da resposta da requisição. Primeiro precisamos recuperar a string JSON retornada pelo serviço, que é realizado através do método getText do objeto response, que é recebido como parâmetro do evento.</p>
</div>
<div class="mceTemp mceIEcenter">
<div>
<dl><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt2.jpg"></a></p>
<div id="attachment_470" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt31.jpg"><img class="size-medium wp-image-470" title="WCF_GWT3" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt31.jpg?w=300&#038;h=140" alt="" width="300" height="140" /></a><p class="wp-caption-text">Recuperando o retorno do servico no lado client</p></div>
<p>                Antes de testarmos o código para realizar a requisição HTTP devemos alterar o arquivo web.xml. Essa alteração incluirá nas configurações do projeto a biblioteca que realiza as requisições HTTP:</p>
<div id="attachment_471" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt61.jpg"><img class="size-medium wp-image-471" title="WCF_GWT6" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt61.jpg?w=300&#038;h=185" alt="" width="300" height="185" /></a><p class="wp-caption-text">Configurando o projeto para realizar requisicoes HTTP</p></div>
<p>                O próximo passo é transformar a string JSON em objetos para podermos utilizar os dados vindos da aplicação WCF em nossa aplicação JAVA. No framework GWT temos algumas APIs que nos ajudam nesse trabalho.</p>
<p>Primeiro precisamos declarar um objeto semelhante ao utilizado no lado Server (que está em C#). Ele deve possuir as mesmas propriedades com os mesmos tipos de dados do lado server. Porém o objeto do lado client (em JAVA) deve herdar da classe JavaScriptObject para tornar possível o manuseio dos objetos e de suas propriedades após a tradução do código JAVA para JavaScript. Lembre que a requisição e o tratamento do seu resultado serão executados no cliente após o código ser traduzido de JAVA para JavaScript pelo GWT. Outro ponto de atenção é o código presente após a declaração das propriedades. Esses códigos não são comentários, mas sim códigos javascript que serão colocados nas rotinas de acesso às propriedades dos objetos. Assim esses códigos devem ser escritos como apresentado. A regra de formação desse código javascript é return this.&lt;nome original da propriedade&gt;.  </p>
</dl>
</div>
</div>
<div id="attachment_463" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt4.jpg"><img class="size-medium wp-image-463" title="WCF_GWT4" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt4.jpg?w=300&#038;h=210" alt="" width="300" height="210" /></a><p class="wp-caption-text">Comparando a classe client (JAVA) com a classe Server (C#)</p></div>
<p>                O segundo passo no tratamento da string JSON é declarar outro método na classe MainPanel. Esse método fará a transformação da string JSON em objetos JAVA, semelhante ao que fizemos em Silverlight no post passado. Lembre que os códigos javascript que estão no comentário também serão trocados durante a tradução de JAVA para javascript pelo GWT. </p>
<div id="attachment_464" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt5.jpg"><img class="size-medium wp-image-464" title="WCF_GWT5" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt5.jpg?w=300&#038;h=34" alt="" width="300" height="34" /></a><p class="wp-caption-text">Codigo para converter a string JSON em objetos</p></div>
<p>                Com a conclusão desses dois passos temos a estrutura para convertemos a string JSON em objetos JAVA. Porém antes devemos realizar um tratamento na string JSON para retirar alguns trechos que são adicionados pelo WCF e que são desnecessários no GWT. Esse tratamento é a retirada do início da string até o colchetes “[“ e do trecho a partir do último colchete “]” até o final da string. Para deixar o exemplo simples contei quantos caracteres deveriam ser retirados no início e no fim da string.</p>
<div id="attachment_465" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt7.jpg"><img class="size-medium wp-image-465" title="WCF_GWT7" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt7.jpg?w=300&#038;h=128" alt="" width="300" height="128" /></a><p class="wp-caption-text">Tratamento da string JSON antes da conversao em objetos</p></div>
<p>                O passo final é utilizarmos a estrutura criada para converter a string tratada em objetos JAVA. Porém não podemos converter a string em um array de objetos diretamente. A conversão deve ser realizada para o tipo JsArray, que utilizará o nosso objeto como template. No exemplo recuperei o tamanho do array e percorri cada item recuperando uma propriedade para mostrar como trabalhar com os objetos que são o retorno da conversão. </p>
<div id="attachment_466" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt8.jpg"><img class="size-medium wp-image-466" title="WCF_GWT8" src="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt8.jpg?w=300&#038;h=142" alt="" width="300" height="142" /></a><p class="wp-caption-text">Codigo para converter a string JSON em objetos e utiliza-los</p></div>
<p>                Podemos agora testar o exemplo. Adicione alguns breakpoints no código JAVA e também um breakpoint no método do serviço WCF. Assim poderemos ver todo o fluxo do exemplo.</p>
<p>                Temos nesse ponto um exemplo simples, que pode ser estendido para cenários mais complexos, de interoperabilidade entre a plataforma Microsoft e a plataforma Google + JAVA através de REST. Como sempre deixei os fontes utilizados, nesse caso com o nome WCF_JSON_GWT.zip, no post no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky drive</a>.</p>
<p>Abraços a todos e até o próximo post</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/467/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/467/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/467/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=467&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/03/29/integrando-o-app-engine-gwt-com-servicos-wcf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt11.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt21.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt31.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt61.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt4.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt5.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt7.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT7</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/03/wcf_gwt8.jpg?w=300" medium="image">
			<media:title type="html">WCF_GWT8</media:title>
		</media:content>
	</item>
		<item>
		<title>WCF + Silverlight: Utilizando REST e JSON em serviços</title>
		<link>http://flaviomoraes.wordpress.com/2010/02/26/wcf-silverlight-utilizando-rest-e-json-em-servicos/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/02/26/wcf-silverlight-utilizando-rest-e-json-em-servicos/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 21:53:32 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=456</guid>
		<description><![CDATA[Olá a todos,                 Nesse post vamos falar mais um pouco sobre WCF e como consumir serviços em aplicações Silverlight. Os cenários de serviços WCF cobertos até o momento trafegavam dados pelo protocolo SOAP ou por integração com o MSMQ. &#8230; <a href="http://flaviomoraes.wordpress.com/2010/02/26/wcf-silverlight-utilizando-rest-e-json-em-servicos/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=456&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>                Nesse post vamos falar mais um pouco sobre WCF e como consumir serviços em aplicações Silverlight. Os cenários de serviços WCF cobertos até o momento trafegavam dados pelo protocolo SOAP ou por integração com o MSMQ. Demonstraremos nesse post como construir serviços WCF que utilizem o protocolo REST e trafegam dados no formato JSON. Demonstraremos também como consumir serviços com essa configuração em aplicações desenvolvidas em Silverlight.</p>
<p>REST é um protocolo de comunicação sendo uma alternativa ao protocolo SOAP, há um <a href="http://blogs.msdn.com/wcamb/archive/2008/07/03/cen-rios-de-implementa-o-de-servi-os-com-wcf-parte-3-servi-os-para-web-2-0.aspx">post interessante do Waldemir</a> sobre o assunto. Já JSON é um formato de encapsulamento de dados, que pode ser visto como uma alternativa ao XML, tendo como principal vantagem a menor quantidade de dados trafegados entre o serviço e o consumidor. Sendo assim ele pode ser indicado para uso em cenários com largura de banda restrita.</p>
<p>                Começaremos nosso exemplo criando uma solução nova e adicionando um projeto do tipo Silverlight. Criaremos também um projeto Web que usaremos para hospedar nosso serviço WCF. Teremos então um cenário ainda não coberto no blog, que é a hospedagem de serviços WCF em aplicações Web. Outra característica é que o serviço WCF e a aplicação Silverlight estarão no mesmo local de origem, portanto não há a necessidade de expormos o arquivo crossdomain.xml ou ClientAccessPolicy.xml.</p>
<p>                Adicionaremos no projeto Web um serviço WCF, que no exemplo chamei de Usuario. Para expor as funcionalidades desse serviço através do protocolo REST e utilizar o formato JSON devemos realizar algumas alterações no contrato. Primeiro acrescentaremos os parâmetros <em>Namespace</em> e <em>Name</em> ao atributo ServiceContract. Outra alteração será na declaração do método que receberá o atributo WebInvoke para utilizar o protocolo REST. Nos parâmetros desse atributo deverá ser informado o verbo que disparará o método, nesse caso GET e o tipo de formato de resposta, que será JSON. Com esse último parâmetro poderemos ter como retorno dos métodos objetos comuns, deixando a cargo do WCF a serialização desses objetos em string JSON.</p>
<p> Utilizamos o parâmetro UriTemplate no atributo WebInvoke para formatar como será realizada a chamada ao método e como serão passados seus parâmetros. Para informar a posição de um parâmetro para o método devemos utilizar o nome desse parâmetro entre chaves. O restante da string que não são os nomes dos parâmetros, que devem estar entre as chaves, será utilizado para formar a Uri de requisição. Logo se temos um método que recebe um parâmetro chamado valor e formamos a string do UriTemplate como MeuServicoe/{valor} a sua chamada desse método deverá ser realizada pelo endereço base do serviço (ex. localhost:8080) seguido do template. Portanto a Uri da requisição será <a href="http://localhost:8080/MeuServico/123">HTTP://localhost:8080/MeuServico/123</a>, onde 123 será o valor passado para o parâmetro. Note que a Uri não precisa conter o nome do método. Para uso do atributo WebInvoke nos métodos do contrato devemos adicionar o assembly System.ServiceModel.Web.</p>
<div id="attachment_444" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json1.jpg"><img class="size-medium wp-image-444" title="JSON1" src="http://flaviomoraes.files.wordpress.com/2010/02/json1.jpg?w=300&#038;h=61" alt="" width="300" height="61" /></a><p class="wp-caption-text">Codigo do contrato do servico</p></div>
<p>Para demonstrarmos o uso do JSON o método retornará uma string nesse formato que representa um array de objetos. Portanto criamos uma classe para representar os objetos que serão retornados pelo método.</p>
<div id="attachment_445" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json2.jpg"><img class="size-medium wp-image-445" title="JSON2" src="http://flaviomoraes.files.wordpress.com/2010/02/json2.jpg?w=300&#038;h=174" alt="" width="300" height="174" /></a><p class="wp-caption-text">Codigo da classe para tafegaros objetos</p></div>
<p>Passaremos agora para a implementação do serviço. A classe que implementará o serviço deverá ser decorada com o atributo ServiceBehavior que deverá receber o parâmetro AddressfilterMode como Any, desabilitando o filtro da origem das requisições. O método então receberá o parâmetro name, que será utilizado no construtor de um objeto do tipo MeuUsuario e retornará um array dessa classe através de uma string no formato JSON.</p>
<div id="attachment_446" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json3.jpg"><img class="size-medium wp-image-446" title="JSON3" src="http://flaviomoraes.files.wordpress.com/2010/02/json3.jpg?w=300&#038;h=82" alt="" width="300" height="82" /></a><p class="wp-caption-text">Codigo do servico</p></div>
<p>Resta agora configurar o serviço para ser exposto na aplicação Web. As configurações devem ser realizadas no arquivo web.config onde o endpoint deverá utilizar o binding webHttpBinding e possuir habilitada a configuração webHttp, essas configurações são necessárias para utilizar o protocolo REST.</p>
<div id="attachment_447" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json4.jpg"><img class="size-medium wp-image-447" title="JSON4" src="http://flaviomoraes.files.wordpress.com/2010/02/json4.jpg?w=300&#038;h=143" alt="" width="300" height="143" /></a><p class="wp-caption-text">Trecho do arquivo web.config com as configuracoes do servio</p></div>
<p>Após realizar a configuração podemos testar o serviço. Coloque um break point no método do serviço para vermos quando ele será invocado. Em seguida inicie a aplicação em modo debug, com isso será aberta uma janela de um browser de internet. Troque o nome da página pelo nome do serviço (com a extensão .svc, pois estamos em uma aplicação Web) e complete com o UriTemplate, substituindo os nomes dos parâmetros pelo valores que serão passados para o método. Veja que o método será disparado, recebendo os parâmetros informados na Uri.</p>
<div id="attachment_448" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json5.jpg"><img class="size-medium wp-image-448" title="JSON5" src="http://flaviomoraes.files.wordpress.com/2010/02/json5.jpg?w=300&#038;h=78" alt="" width="300" height="78" /></a><p class="wp-caption-text">Barra de endereco do browse com a URL inicial do projeto</p></div>
<div id="attachment_449" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json6.jpg"><img class="size-medium wp-image-449" title="JSON6" src="http://flaviomoraes.files.wordpress.com/2010/02/json6.jpg?w=300&#038;h=89" alt="" width="300" height="89" /></a><p class="wp-caption-text">Barra de endereco do browser com a URI para chamada do servico</p></div>
<div id="attachment_450" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json7.jpg"><img class="size-medium wp-image-450" title="JSON7" src="http://flaviomoraes.files.wordpress.com/2010/02/json7.jpg?w=300&#038;h=40" alt="" width="300" height="40" /></a><p class="wp-caption-text">Break point para acompanhar a chamada do servico</p></div>
<p>Temos então um serviço WCF que utiliza o protocolo REST e disponibiliza o resultado de seu método em uma string no formato JSON. Podemos passar para a construção do cliente que irá consumir esse serviço. Antes, porém para simplificar o desenvolvimento vamos fixar a porta em que o projeto web, e conseqüentemente o serviço WCF, será disponibilizado. Essa configuração é realizada nas propriedades do projeto Web, na aba Web e selecionando a opção Specific Port. Assim tanto a aplicação Silverlight como o serviço WCF responderão sempre a partir dessa porta pré-determinada.</p>
<div id="attachment_451" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json8.jpg"><img class="size-medium wp-image-451" title="JSON8" src="http://flaviomoraes.files.wordpress.com/2010/02/json8.jpg?w=300&#038;h=102" alt="" width="300" height="102" /></a><p class="wp-caption-text">Alterando as propriedades do projeto WEB</p></div>
<p>Iremos agora alterar o projeto Silverlight para consumir o serviço. Primeiro vamos alterar a interface com o usuário através do arquivo XAML, onde adicionaremos uma lista para receber e mostrar os objetos e um botão para disparar o consumo do serviço. Em seguida deveremos escrever o código que fará a requisição e mostrará os objetos na lista.</p>
<div id="attachment_452" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json9.jpg"><img class="size-medium wp-image-452" title="JSON9" src="http://flaviomoraes.files.wordpress.com/2010/02/json9.jpg?w=300&#038;h=180" alt="" width="300" height="180" /></a><p class="wp-caption-text">Codigo XAML da aplicacao Silverlight</p></div>
<p>O código utiliza um objeto do tipo WebClient para realizar a requisição. Esse objeto pode ser utilizado para realizarmos qualquer tipo de requisição HTTP. Porém as requisições são assíncronas, como quando utilizarmos os proxys gerados pelo Visual Studio. Logo antes de realizar a requisição devemos associar um método ao evento disparado quando o resultado dessa chamada é recebido.</p>
<div id="attachment_453" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json10.jpg"><img class="size-medium wp-image-453" title="JSON10" src="http://flaviomoraes.files.wordpress.com/2010/02/json10.jpg?w=300&#038;h=100" alt="" width="300" height="100" /></a><p class="wp-caption-text">Codigo para realizar a chamada ao servico</p></div>
<p>Recebemos da chamada um objeto do tipo Stream. Nesse exemplo vamos transformá-lo em uma string e em seguida des-serializar os objetos a partir dessa string. Utilizei para des-serializar a string um método que chamei de Deserialize. Ele recebe a string JSON como parâmetro e o tipo de objeto que deve ser retornado como generic e utiliza a classe DataContractJsonSerializer para realizar a tarefa. Essa classe pode ser utilizada para serializar objetos em string JSON também. Note que no método que faz os tratamentos da resposta, disparado pelo evento, existe um trecho que remove uma parte da string. Esse tratamento é necessário, pois o WCF incluiu na resposta da chamada um trecho de texto que identifica o nome do método chamado. E é exatamente esse trecho que é removido no código com as operações de string.</p>
<div id="attachment_454" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json11.jpg"><img class="size-medium wp-image-454" title="JSON11" src="http://flaviomoraes.files.wordpress.com/2010/02/json11.jpg?w=300&#038;h=231" alt="" width="300" height="231" /></a><p class="wp-caption-text">Codigo para receber e tratar a resposta do servico</p></div>
<p>Podemos agora testar nossa aplicação Silverlight. Devemos iniciar o projeto web e clicar no botão da aplicação. Será enviada uma requisição para o serviço, que responderá com a string JSON representando os objetos. A aplicação Silverlight fará a des-serialização dos objetos e os mostrará em uma lista. Temos então uma pequena aplicação desenvolvida em Silverlight que consome um serviço WCF utilizando protocolo REST com os dados trafegados no formato JSON. O exemplo utilizado nesse post está disponível no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a> com o nome WCF_JSON.zip.</p>
<div id="attachment_455" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/02/json12.jpg"><img class="size-medium wp-image-455" title="JSON12" src="http://flaviomoraes.files.wordpress.com/2010/02/json12.jpg?w=300&#038;h=181" alt="" width="300" height="181" /></a><p class="wp-caption-text">Teste da aplicacao</p></div>
<p>Abraços a todos e até o próximo post!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/456/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=456&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/02/26/wcf-silverlight-utilizando-rest-e-json-em-servicos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json1.jpg?w=300" medium="image">
			<media:title type="html">JSON1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json2.jpg?w=300" medium="image">
			<media:title type="html">JSON2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json3.jpg?w=300" medium="image">
			<media:title type="html">JSON3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json4.jpg?w=300" medium="image">
			<media:title type="html">JSON4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json5.jpg?w=300" medium="image">
			<media:title type="html">JSON5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json6.jpg?w=300" medium="image">
			<media:title type="html">JSON6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json7.jpg?w=300" medium="image">
			<media:title type="html">JSON7</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json8.jpg?w=300" medium="image">
			<media:title type="html">JSON8</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json9.jpg?w=300" medium="image">
			<media:title type="html">JSON9</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json10.jpg?w=300" medium="image">
			<media:title type="html">JSON10</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json11.jpg?w=300" medium="image">
			<media:title type="html">JSON11</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/02/json12.jpg?w=300" medium="image">
			<media:title type="html">JSON12</media:title>
		</media:content>
	</item>
		<item>
		<title>App Engine: Construindo o lado Server com o auxílio do GWT</title>
		<link>http://flaviomoraes.wordpress.com/2010/01/31/app-engine-construindo-o-lado-server-com-o-auxilio-do-gwt/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/01/31/app-engine-construindo-o-lado-server-com-o-auxilio-do-gwt/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 19:23:49 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[App Engine]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=442</guid>
		<description><![CDATA[Olá a todos                 Nesse post demonstraremos como podemos construir a comunicação entre os lados cliente e servidor utilizando o GWT. Como já dissemos em um post anterior essa comunicação possui a desvantagem de utilizar um protocolo proprietário, portanto não &#8230; <a href="http://flaviomoraes.wordpress.com/2010/01/31/app-engine-construindo-o-lado-server-com-o-auxilio-do-gwt/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=442&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos</p>
<p>                Nesse post demonstraremos como podemos construir a comunicação entre os lados cliente e servidor utilizando o GWT. Como já dissemos em um <a href="http://flaviomoraes.wordpress.com/2010/01/06/app-engine-utilizando-o-gwt-para-construir-a-camada-de-apresentacao/">post anterior</a> essa comunicação possui a desvantagem de utilizar um protocolo proprietário, portanto não será possível a integração desse modelo com outras tecnologias. Em contrapartida sua implementação é muito simples. Começaremos o nosso exemplo utilizando o projeto construído no <a href="http://flaviomoraes.wordpress.com/2010/01/06/app-engine-utilizando-o-gwt-para-construir-a-camada-de-apresentacao/">post anterior</a> sobre o assunto. A partir desse ponto desenvolveremos o código da funcionalidade do lado Server e a comunicação entre as camadas.</p>
<p>                Antes de iniciarmos o desenvolvimento de código vamos entender como funciona o mecanismo de comunicação do GWT. Os métodos que serão expostos no lado Server para serem invocados pelo cliente deverão ser listados em uma interface. O serviço deverá então implementar essa interface em uma classe cujo nome será composto pelo nome da interface com o sufixo Impl. Na estrutura do GWT a chamada dos métodos ocorre de forma assíncrona. Portanto teremos no lado cliente um método para invocar o lado Server e um evento que será disparado quando o lado cliente receber a resposta do servidor. Para montarmos a estrutura assíncrona deveremos criar outra interface no lado cliente com os métodos e os eventos. A criação da comunicação entre os dois lados é realizada pelo objeto GWT através do método Create. Esse método criará um objeto que poderemos utilizar para invocar os métodos do lado Server.</p>
<p>Essa estrutura é muito semelhante ao cenário de um serviço WCF consumido por uma aplicação desenvolvida em Silverlight. Em ambas as tecnologias temos uma interface que lista os métodos disponibilizados e as chamadas são assíncronas. A implementação das funcionalidades é realizada através de uma classe que implementa essa interface. O ponto fraco do GWT é que precisamos respeitar um padrão para criar as classes. Já o ponto fraco da plataforma .Net é que precisamos adicionar a referência do serviço, caso contrário o código torna-se mais complexo.</p>
<p>Começaremos a implementação da comunicação entre o lado cliente e o lado servidor estabelecendo a interface que listará os métodos que serão expostos. Essa interface deverá ser criada na subpasta cliente e extender a interface RemoteService. Nesse exemplo adicionaremos uma interface chamada ControleAcesso que possuirá um método chamado Login. Essa interface deverá ser decorada com o atributo RemoteServiceRelativePath, que será utilizado para formar o endereço do servlet.</p>
<div id="attachment_437" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server1.jpg"><img class="size-medium wp-image-437" title="GWT_Server1" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server1.jpg?w=300&#038;h=120" alt="" width="300" height="120" /></a><p class="wp-caption-text">Criando a interface principal</p></div>
<p>Criaremos agora o lado servidor. Para isso adicione uma classe na subpasta Server. Essa classe deverá herdar da classe RemoteServiceServet e implementar a interface criada anteriormente. Tome o cuidado para nomear essa classe com o nome da interface seguido do prefixo Impl.</p>
<div id="attachment_438" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server2.jpg"><img class="size-medium wp-image-438" title="GWT_Server2" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server2.jpg?w=300&#038;h=120" alt="" width="300" height="120" /></a><p class="wp-caption-text">Classe que implementa o servlet</p></div>
<p>Podemos depurar o lado Server em nossa máquina de trabalho, porém são necessárias algumas configurações no arquivo web.xml. Primeiro precisamos adicionar uma entrada na sessão servlet, onde teremos o nome do servlet, que será o nome da interface, e o nome completo da classe que implementa essa interface. Em seguida devemos adicionar uma entrada na sessão servlet-mapping , onde devemos adicionar novamente o nome da interface e o parâmetro informado no atributo RemoteServiceRelativePath, que está na declaração da interface.</p>
<div id="attachment_439" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server3.jpg"><img class="size-medium wp-image-439" title="GWT_Server3" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server3.jpg?w=300&#038;h=195" alt="" width="300" height="195" /></a><p class="wp-caption-text">Configurando a aplicacao para depurar o servlet</p></div>
<p>Desenvolveremos agora o lado cliente da comunicação. O primeiro passo nessa tarefa é definirmos a interface para a chamada assíncrona. O nome dessa interface deverá ser formado pelo nome da interface principal seguido do sufixo Async e deverá ser criada na subpasta cliente. Para cada método da interface principal deveremos criar um método equivalente com o mesmo nome e parâmetro, porém os métodos dessa interface deverão retornar void e possuir como último parâmetro um objeto do tipo AsyncCallBack que recebe como tipo o mesmo tipo de retorno do método da interface principal.</p>
<div id="attachment_440" class="wp-caption aligncenter" style="width: 509px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server4.jpg"><img class="size-full wp-image-440" title="GWT_Server4" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server4.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Codigo da interface assincrona</p></div>
<p>Resta agora realizar a chamada ao método. Voltaremos na classe LoginPanel, desenvolvida no post anterior, e alteraremos o evento de click do botão. O primeiro passo é criar um ponteiro para a interface através do método Create do objeto GWT. Em seguida devemos criar um objeto do tipo AsyncCallBack, recebendo o mesmo tipo de objeto que o retorno do método da interface principal e que implemente os métodos onFailure e onSuccess. O evento onSuccess será disparado quando a chamada do método for completa, já o método onFailure é chamado quando ocorre algo inesperado na execução do método.</p>
<div id="attachment_441" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server5.jpg"><img class="size-medium wp-image-441" title="GWT_Server5" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server5.jpg?w=300&#038;h=164" alt="" width="300" height="164" /></a><p class="wp-caption-text">Codigo para consumir o servlet</p></div>
<p>Podemos agora testar o exemplo. Adicione breakpoints no evento do clique do botão e no código Server. Em seguida execute a aplicação e clique no botão para ver seu funcionamento. Como sempre deixei no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a> uma cópia do projeto utilizado para construir o exemplo do post, nesse caso o arquivo chama-se GWT_Server.zip.</p>
<p>Abraço a todos e até o próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/442/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/442/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/442/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/442/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/442/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/442/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/442/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/442/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=442&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/01/31/app-engine-construindo-o-lado-server-com-o-auxilio-do-gwt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server1.jpg?w=300" medium="image">
			<media:title type="html">GWT_Server1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server2.jpg?w=300" medium="image">
			<media:title type="html">GWT_Server2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server3.jpg?w=300" medium="image">
			<media:title type="html">GWT_Server3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server4.jpg" medium="image">
			<media:title type="html">GWT_Server4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt_server5.jpg?w=300" medium="image">
			<media:title type="html">GWT_Server5</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight: Consumindo serviços hospedados em Windows Services e outros executáveis</title>
		<link>http://flaviomoraes.wordpress.com/2010/01/10/silverlight-consumindo-servicos-hospedados-em-windows-services-e-outros-executaveis/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/01/10/silverlight-consumindo-servicos-hospedados-em-windows-services-e-outros-executaveis/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 13:13:04 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[Camada de Apresentação]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows Service]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=433</guid>
		<description><![CDATA[Olá a todos,                 Nos últimos posts sobre a plataforma Microsoft demonstramos como aplicações desenvolvidas em Silverlight podem consumir serviços WCF. Nesses posts abordamos como consumir um serviço WCF no mesmo local de origem ou em outros locais de origem, &#8230; <a href="http://flaviomoraes.wordpress.com/2010/01/10/silverlight-consumindo-servicos-hospedados-em-windows-services-e-outros-executaveis/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=433&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>                Nos últimos posts sobre a plataforma Microsoft demonstramos como aplicações desenvolvidas em Silverlight podem consumir serviços WCF. Nesses posts abordamos como <a href="http://flaviomoraes.wordpress.com/2009/11/12/consumindo-servicos-wcf-em-silverlight/">consumir um serviço WCF no mesmo local de origem</a> ou em <a href="http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/">outros locais de origem</a>, porém nesses exemplos as aplicações WCF eram hospedadas no IIS ou em Web Role do Windows Azure. Nesse post abordaremos o consumo de serviço WCF que estejam hospedados em <em>Windows Services</em>, <em>Console Application</em> ou outros tipo de executáveis.</p>
<p>                Primeiro devemos lembrar que nossas aplicações desenvolvidas em Silverlight ficam hospedadas em páginas web, normalmente HTML ou ASPX. Portanto se tivermos uma aplicação WCF hospedada em algum executável ele necessariamente estará em outro local de origem, pois duas aplicações não conseguem utilizar a mesma porta com a mesma URI. Como conseqüência precisaremos disponibilizar com os serviços o arquivo <em>crossdomain.xml</em> ou o arquivo <em>clientaccesspolicy.xml</em>.</p>
<p>                Entretanto, não basta simplesmente adicionar esses arquivos na mesma pasta onde estão os serviços, pois a nossa aplicação em Silverlight não conseguirá acessá-los. A solução para essa situação é desenvolvermos outro serviço WCF que disponibilize o conteúdo desses arquivos. Porém há uma restrição no desenho deve serviço, pois as aplicações em Silverlight buscam os arquivos de acesso através de uma requisição REST na raiz da URI. Logo esse serviço deverá obrigatoriamente disponibilizar o conteúdo desses arquivos através do protocolo REST via verbo GET na raiz da URI onde está exposto o nosso serviço.</p>
<p>                Para demonstrar a construção dessa estrutura começaremos um novo projeto. Nesse projeto adicionaremos um projeto do tipo <em>Windows Service</em>, que servirá de host dos serviços WCF, e uma aplicação Silverlight, para consumir o serviço principal.</p>
<div id="attachment_426" class="wp-caption aligncenter" style="width: 233px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl1.jpg"><img class="size-medium wp-image-426" title="WCFSL1" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl1.jpg?w=223&#038;h=300" alt="" width="223" height="300" /></a><p class="wp-caption-text">Estrutura inicial da solucao</p></div>
<p>               No projeto <em>Windows Service</em> adicionaremos um serviço WCF e alteraremos o método fornecido no <em>template</em> para receber e retornar um parâmetro do tipo string. Esse método então funcionará como um eco. Na prática os métodos de nossas aplicações WCF executarão tarefas mais complexas, porém deixamos o exemplo simples para focarmos na disponibilização dos arquivos de acesso.</p>
<div id="attachment_427" class="wp-caption aligncenter" style="width: 253px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl2.jpg"><img class="size-full wp-image-427" title="WCFSL2" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl2.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Contrato do servico principal</p></div>
<div id="attachment_428" class="wp-caption aligncenter" style="width: 309px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl3.jpg"><img class="size-medium wp-image-428" title="WCFSL3" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl3.jpg?w=299&#038;h=66" alt="" width="299" height="66" /></a><p class="wp-caption-text">Implementacao do servico principal</p></div>
<p>                Em seguida devemos adicionar outro serviço WCF que publicará o conteúdo dos arquivos de acesso para aplicações em Silverlight, Flash ou JavaScript. Nesse exemplo publicaremos o arquivo <em>clientaccesspolicy.xml, </em>porém podemos seguir os mesmos passos para publicar o arquivo <em>crossdomain.xml</em>. Como as aplicações cliente buscam o conteúdo de acesso na raiz do URI dos serviços que serão consumidos precisamos somente de um serviço expondo esse contudo, logo faz sentido termos um serviço exclusivo para essas tarefa.</p>
<p>                Como o serviço deverá expor o conteúdo através do protocolo REST e pelo verbo GET devemos realizar algumas alterações no contrato. Ele deverá ser decorado com o atributo <em>WebGet</em> e o método deverá retornar um tipo Message do <em>namespace</em> System.ServiceModel.Channels.</p>
<div id="attachment_429" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl4.jpg"><img class="size-medium wp-image-429" title="WCFSL4" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl4.jpg?w=300&#038;h=221" alt="" width="300" height="221" /></a><p class="wp-caption-text">Contrato do servico que disponibiliza o arquivo de acesso</p></div>
<p>                Na implementação do serviço o método deverá ler o conteúdo do arquivo e retorná-lo através de um tipo Message. Nesse ponto há um detalhe importante: se passarmos diretamente o <em>stream</em> para o método que cria o XMLReader ele travará o arquivo aberto com acesso exclusivo, portanto outras execuções desse método ou outras aplicações que tentarem abri-lo receberão uma exceção. O modo de contornar essa situação é carregarmos o conteúdo do arquivo em uma variável do tipo string, passando o conteúdo dessa string para o método que cria o XMLReader. Outro ponto que deve ser lembrado é que não podemos fechar o objeto XmlReader. Pois caso ele seja fechado a aplicação cliente não conseguirá ler o conteúdo do <em>stream</em> que será disponibilizado pelo método.</p>
<div id="attachment_430" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl5.jpg"><img class="size-medium wp-image-430" title="WCFSL5" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl5.jpg?w=300&#038;h=231" alt="" width="300" height="231" /></a><p class="wp-caption-text">Implementacao do servico que disponibiliza o conteudo do arquivo de acesso</p></div>
<p>               Para finalizar nossa estrutura devemos criar o arquivo <em>clientaccesspolicy.xml</em>. Para isso podemos adicionar um novo item do tipo Arquivo XML no projeto que hospeda os serviços WCF. Criado o arquivo na solução devemos alterar a propriedade <em>Copy to Outpu Directory</em> para <em>Copy Always</em>, assim esse arquivo será sempre copiado para a mesma pasta do executável. Caso contrário deveremos alterar a abertura do arquivo na implementação do serviço para busca esse arquivo em outra pasta.</p>
<div id="attachment_434" class="wp-caption aligncenter" style="width: 308px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl8.jpg"><img class="size-full wp-image-434" title="WCFSL8" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl8.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Alterando a propriedade do arquivo ClientAccessPolicy.xml</p></div>
<p>               Outro detalhe importante nessa implementação é o conteúdo desse arquivo, pois deve estar explicito quais tipos de requisição (HTTP ou HTTPS) serão permitidas. No exemplo permiti o consumo tanto por requisições HTTP como HTTPS.</p>
<div id="attachment_435" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl9.jpg"><img class="size-medium wp-image-435" title="WCFSL9" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl9.jpg?w=300&#038;h=180" alt="" width="300" height="180" /></a><p class="wp-caption-text">Conteudo do arquivo ClientAcessPolicy.xml</p></div>
<p>               Agora devemos alterar o início do <em>Windows Service</em> para ele carregar e abrir os serviços. O serviço principal deverá utilizar o <em>binding</em> BasicHttpBinding, pois esse é o único <em>binding</em> disponível para aplicações desenvolvidas em Siverlight. Já o serviço que disponibiliza o conteúdo do arquivo de acesso deverá utilizar o <em>binding</em> WebHttpBinding e seu endereço deverá ser a raiz da URI do serviço principal.</p>
<div id="attachment_431" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl6.jpg"><img class="size-medium wp-image-431" title="WCFSL6" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl6.jpg?w=300&#038;h=106" alt="" width="300" height="106" /></a><p class="wp-caption-text">Configuracoes dos servicos</p></div>
<p>               Nesse ponto a estrutura do lado Server está montada. Podemos agora gerar o Proxy e consumir o serviço principal. Para gerar o Proxy compilei os projetos como debug e executei o <em>host</em> via linha de comando. Nesse caso lembre-se de iniciar a janela com privilégios de administrador. O código da aplicação em Silverlight para consumir o serviço pode ser montado conforme já descrito em <a href="http://flaviomoraes.wordpress.com/2009/11/12/consumindo-servicos-wcf-em-silverlight/">outro post</a>.</p>
<div id="attachment_432" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl7.jpg"><img class="size-medium wp-image-432" title="WCFSL7" src="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl7.jpg?w=300&#038;h=180" alt="" width="300" height="180" /></a><p class="wp-caption-text">Codigo da aplicacao Silverlight para consumir o servico</p></div>
<p>               Nesse ponto temos concluído também o lado <em>client</em> e portanto podemos testar o nosso exemplo. Para entendermos completamente como uma aplicação desenvolvida em Silverlight consome serviços WCF é interessante adicionarmos <em>break points</em> tanto no início dos eventos do <em>click</em> do botão e da resposta do serviço na aplicação Siverlight, como no início dos métodos dos serviços.</p>
<p>               Como sempre deixei o exemplo utilizado para escrever o post no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a>, esse exemplo está com o nome <em>WCF_SelfHosted_Silverlight.zip</em>.</p>
<p>Abraço a todos!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/433/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=433&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/01/10/silverlight-consumindo-servicos-hospedados-em-windows-services-e-outros-executaveis/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl1.jpg?w=223" medium="image">
			<media:title type="html">WCFSL1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl2.jpg" medium="image">
			<media:title type="html">WCFSL2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl3.jpg?w=299" medium="image">
			<media:title type="html">WCFSL3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl4.jpg?w=300" medium="image">
			<media:title type="html">WCFSL4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl5.jpg?w=300" medium="image">
			<media:title type="html">WCFSL5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl8.jpg" medium="image">
			<media:title type="html">WCFSL8</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl9.jpg?w=300" medium="image">
			<media:title type="html">WCFSL9</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl6.jpg?w=300" medium="image">
			<media:title type="html">WCFSL6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/wcfsl7.jpg?w=300" medium="image">
			<media:title type="html">WCFSL7</media:title>
		</media:content>
	</item>
		<item>
		<title>App Engine: Utilizando o GWT para construir a camada de apresentação</title>
		<link>http://flaviomoraes.wordpress.com/2010/01/06/app-engine-utilizando-o-gwt-para-construir-a-camada-de-apresentacao/</link>
		<comments>http://flaviomoraes.wordpress.com/2010/01/06/app-engine-utilizando-o-gwt-para-construir-a-camada-de-apresentacao/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 21:58:41 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[App Engine]]></category>
		<category><![CDATA[Camada de Apresentação]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=419</guid>
		<description><![CDATA[Olá a todos,                   Em posts anteriores fizemos uma pequena apresentação do que é o App Engine e como preparar uma máquina para desenvolver nessa plataforma. Já demonstramos também como é possível desenvolver a camada de apresentação em páginas JSP &#8230; <a href="http://flaviomoraes.wordpress.com/2010/01/06/app-engine-utilizando-o-gwt-para-construir-a-camada-de-apresentacao/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=419&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,  </p>
<p>                Em posts anteriores fizemos uma pequena apresentação do <a href="http://flaviomoraes.wordpress.com/2009/11/22/app-engine-plataforma-de-clouding-computing-da-google/">que é o App Engine e como preparar uma máquina para desenvolver</a> nessa plataforma. Já demonstramos também como é possível <a href="http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/">desenvolver a camada de apresentação em páginas JSP e como publicar nossa aplicação</a> nos servidores do <a href="http://code.google.com/intl/pt-BR/appengine/">App Engine</a>. Nesse post continuaremos falando sobre como desenvolver a camada de apresentação nessa plataforma. Porém dessa vez o foco será utilizar o <a href="http://code.google.com/intl/pt-BR/webtoolkit/">Google Web Toolkit (GWT).</a> </p>
<p>                O GWT é uma biblioteca que facilita a construção da camada de apresentação e da comunicação com o lado Server das nossas aplicações. Para quem conhece a plataforma Microsoft podemos dizer que o GWT é um meio termo entre o Silverlight e ASP .Net. Suas principais vantagens são a ausência da necessidade da instalação de um plug-in na máquina cliente, pois o código que é recebido pelo browser é HTML e JavaScript, e a facilidade de desenvolvimento (quando comparado com as páginas JSP). Os seus dois pontos fracos são: a falta de uma ferramenta de edição da interface com o usuário, pois tudo é feito no código (caso algum leitor conheça alguma ferramenta nos avise via comentário nesse post) e a comunicação com o lado Server da aplicação, que é realizada por um protocolo proprietário.</p>
<p>                Nesse post demonstraremos como escrever a camada de apresentação de nossas aplicações nessa tecnologia além de apresentar um modelo para facilitar a troca das telas em nossos softwares. Deixaremos a construção da comunicação com o lado Server para outro post. Vamos passar para o nosso exemplo que será um tela de login seguido de uma tela com uma opção para o usuário que acessa outra tela. A partir do desenvolvimento dessa mecânica é esperado que fique fácil a construção da navegação com diversas telas.</p>
<p>                O primeiro passo é criarmos o projeto no Eclipse, através do menu <em>File</em>, opção <em>New</em> e em seguida <em>Web Application Project</em>. Nos será aberta uma tela semelhante a imagem abaixo, onde devemos informar o nome do projeto e de seu pacote. Antes de clicar com o botão OK para criar o projeto verifique se as opções <strong>Use Google App Engine</strong> e <strong>Use Google Web Toolkit</strong> estão habilitadas. A opção <strong>Use Google App Engine</strong> fornece ao projeto as configurações necessárias para ser hospedado nos servidores do Google. Já a opção <strong>Use Google Web Toolkit</strong> configura automaticamente o projeto para utilizar o GWT.  </p>
<div class="mceTemp mceIEcenter" style="text-align:center;">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt11.jpg"><img class="size-medium wp-image-413" title="GWT1" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt11.jpg?w=265&#038;h=300" alt="" width="265" height="300" /></a></dt>
<dd class="wp-caption-dd">Criando um projeto que utilize o GWT</dd>
</dl>
</div>
<p>Confirmadas as configurações do projeto será criada uma estrutura semelhante à descrita em um <a href="http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/">post anterior</a>. Porém será adicionada a referência ao GWT e serão criadas mais duas subpastas dentro da pasta src: uma pasta com o nome do pacote e com o sufixo Server e outra pasta com o sufixo client. Na pasta com o sufixo Server ficam os códigos que rodarão no lado Server e que será assunto de outro post. Na pasta com o sufixo client devemos colocar todos os códigos que são executados no lado cliente.   </p>
<p>Podemos então executar o nosso projeto com o <em>template</em> inicial para confirmar que a instalação de todos os requisitos foi realizada com sucesso. Ao executar o projeto note que duas janelas são abertas. Uma delas é a janela com um mini browser onde é executada a aplicação e outra janela com o nome <strong>Google Web Toolkit Hosted Mode</strong> é uma aplicação que executa o código Java, transformando o resultado em HTML e JavaScript. Segundo a documentação do GWT em tempo de execução é identificado qual o browser que está em uso pelo cliente e o conteúdo enviado é adaptado para esse browser, evitando a necessidade de customizações ou verificações desse tipo no nosso código. Note que o conteúdo dessa última janela é um log do que ocorre na nossa aplicação, algo semelhante ao que podemos fazer com a Fabric local no Windows Azure. Podemos encerrar a sessão fechando essa janela.  </p>
<div id="attachment_414" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt22.jpg"><img class="size-medium wp-image-414" title="GWT2" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt22.jpg?w=300&#038;h=232" alt="" width="300" height="232" /></a><p class="wp-caption-text">Tela do host do GWT</p></div>
<p>Antes de iniciar as alterações no código vamos entender como funciona esse exemplo. A aplicação é iniciada quando a página HTML, situada na pasta war, é acessada. Nessa página temos um código HTML simples onde os pontos de interesse são o código JavaScript, responsável pela chamada ao código Java que será transformado, a chamada desse código javascript e dois itens da tabela que possuem id. Na pratica os únicos pontos que temos que nos preocupar é com esses dois itens da tabela que possuem id, pois como veremos mais adiante são esses itens que conterão o resultado da execução do código Java.  </p>
<div id="attachment_415" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt33.jpg"><img class="size-medium wp-image-415" title="GWT3" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt33.jpg?w=300&#038;h=195" alt="" width="300" height="195" /></a><p class="wp-caption-text">Codigo original da pagina HTML</p></div>
<p>  Vamos agora examinar a classe inicial do nosso projeto que pode ser localizada na subpasta com o sufixo client. O arquivo que contém essa classe possui o mesmo nome do projeto. Note que a classe herda de outra classe chamada <em>EntryPoint</em>. A classe <em>EntryPoint</em> possui a implementação necessária para iniciar a execução do código Java pela engine do GWT. O primeiro método chamado que temos controle é o onModuleLoad. Nele temos a criação e customização de diversos tipos de objetos farão a composição da tela. Nesse método temos o código que monta a relação entre os IDs da página HTML e o código Java, que é realizado pelo objeto <em>RootPanel</em> da clase <em>EntryPoint</em>. Esse objeto tem a capacidade de adicionar ou remover os controles de IDs da página HTML. </p>
<div id="attachment_418" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt43.jpg"><img class="size-medium wp-image-418" title="GWT4" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt43.jpg?w=300&#038;h=254" alt="" width="300" height="254" /></a><p class="wp-caption-text">Trecho do codigo inicial do template</p></div>
<p>Entendido o funcionamento básico do <em>template</em> inicial vamos começar as alterações para construir a nossa aplicação removendo todo o código do método onModuleLoad. Alteraremos também a página HTML, trocando o objeto table por um div, pois para essa demonstração será necessário apenas um item que receberá todo o conteúdo da execução do nosso código. Além disso, vamos desenvolver um método padrão para facilitar a troca de telas. Esse método é baseado no tutorial <em>PageSwitch</em> publicado no site do <a href="http://www.silverlight.net/">Silverlight</a>. </p>
<div id="attachment_420" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt51.jpg"><img class="size-medium wp-image-420" title="GWT5" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt51.jpg?w=300&#038;h=152" alt="" width="300" height="152" /></a><p class="wp-caption-text">Codigo da pagina HTML alterado para o exemplo</p></div>
<p>O primeiro passo é criar uma interface para facilitar a troca de parâmetros entre as telas, assim bastará que os objetos que representam as telas implementem essa interface para estarem prontos para receberem parâmetros de telas anteriores. Essa interface, assim como o restante do código utilizado nesse post devem ser criados na subpasta com o sufixo client. Nesse exemplo utilizei o nome ISwitchable (mesmo nome utilizado no tutorial de Silverlight). Essa interface estabelece apenas um método que será chamado durante a troca de telas com passagem de parâmetros, recebendo um objeto do tipo object para permitir a passagem de qualquer tipo de objeto entre as telas.  </p>
<div id="attachment_421" class="wp-caption aligncenter" style="width: 272px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt61.jpg"><img class="size-full wp-image-421" title="GWT6" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt61.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Codigo da interface para troca de parametros entre paineis</p></div>
<p>O próximo passo é criar a classe que realmente trocará as páginas. Essa classe deverá herdar da classe <em>Widget</em> do pacote do GWT. Nesse exemplo chamei essa classe de PageSwitcher (mesmo nome utilizado no tutorial de Silverlight). Essa classe possui duas versões do método Navigate, onde ambas farão a troca de páginas. A primeira versão troca as páginas sem passagem de parâmetros. Já na segunda versão do método ele realiza a troca de telas com a passagem de parâmetros. A troca de telas é realizada removendo o painel atual do id do HTML e inserindo um novo painel. Quando ocorre essa ação as telas são trocadas instantaneamente. </p>
<div id="attachment_422" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt71.jpg"><img class="size-medium wp-image-422" title="GWT7" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt71.jpg?w=300&#038;h=215" alt="" width="300" height="215" /></a><p class="wp-caption-text">Codigo da classe que realiza a troca dos paineis</p></div>
<p>  O último passo para a montagem do modelo para troca de telas é criar uma classe que realiza a chamada do método Navigate da classe PageSwitcher. Essa classe visa facilitar o uso dessa estrutura. No exemplo chamei essa classe de Switcher. Essa classe possui uma variável membro do tipo PageSwitcher declarada como static. A declaração como static permite que utilizemos a mesma instância do objeto, evitando criarmos diversas cópias desse tipo na memória. Semelhante ao método Navigate da classe PageSwitcher temos nessa classe duas versões do método Switch. Uma versão para troca de telas sem passagem de parâmetros e outra versão para trocarmos a tela informando parâmetros. </p>
<div id="attachment_423" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt81.jpg"><img class="size-medium wp-image-423" title="GWT8" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt81.jpg?w=300&#038;h=219" alt="" width="300" height="219" /></a><p class="wp-caption-text">Codigo da classe Helper que facilita a troca dos paineis</p></div>
<p>Vamos agora passar para a montagem da interface do usuário e uso da nossa estrutura. Para a montagem de cada tela da nossa aplicação precisamos de um objeto do tipo Panel, ou que o estenda, para armazenar e exibir nossos controles. Nesse exemplo criei três classes que herdam da classe <em>VerticalPanel</em>, uma para a tela de login, uma para a tela principal e outra para uma tela de detalhes.</p>
<p>Nesse ponto é onde temos o ponto fraco da tecnologia, pois como não temos um editor visual para desenhar a tela, temos que fazê-lo no código aumentando o tempo de desenvolvimento. Nas telas principal e de detalhe adicionei em cada um <em>label</em> para identificar a tela e um botão para navegar entre elas. Note que no código temos que criar uma instância de cada objeto, alterar suas propriedades de acordo com nossa necessidade e adicionar no painel para estarem visíveis. Além disso, devemos montar via código também os <em>handlers</em> para os eventos, que nesse caso utilizamos somente o clique do mouse nesses botões. Nos eventos do clique do mouse sobre os botões ficam a chamada da nossa estrutura de troca de telas (na verdade painéis), conforme pode ser visto no código. </p>
<div id="attachment_424" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2010/01/gwt91.jpg"><img class="size-medium wp-image-424" title="GWT9" src="http://flaviomoraes.files.wordpress.com/2010/01/gwt91.jpg?w=300&#038;h=243" alt="" width="300" height="243" /></a><p class="wp-caption-text">Codigo de um dos paineis com a implementacao do Handler de click do botao que realiza a troca de paineis</p></div>
<p>Na tela de login montamos uma estrutura um pouco mais complexa, pois adicionamos controles para o usuário informar o login e a senha, além de outros painéis para organizar os controles. Porém nesse post ainda não faremos validações sobre os controles, pois nosso foco agora é apenas demonstrar o uso básico do GWT e uma estrutura para troca de painéis que facilite a construção de aplicações nessa tecnologia. Assim ao clicarmos no botão login seremos direcionados para o painel principal.</p>
<p>Agora podemos executar a nossa aplicação e vê-la funcionando. Temo então um exemplo bem simples, mas que nos permite experimentar o uso do GWT junto com o App Engine. Para publicar essa aplicação nos servidores do Google devem ser seguidos os mesmos passos descritos em um <a href="http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/">post anterior</a>. Como sempre deixei os fontes utilizados para escrever o post no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a>, nesse caso com o nome <em>POCAppengine.zip</em>. Além dos fontes deixei uma cópia do tutorial original de Silverlight explicando o funcionamento do modelo de troca de painéis.</p>
<p>Abraço a todos e até o próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/419/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=419&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2010/01/06/app-engine-utilizando-o-gwt-para-construir-a-camada-de-apresentacao/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt11.jpg?w=265" medium="image">
			<media:title type="html">GWT1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt22.jpg?w=300" medium="image">
			<media:title type="html">GWT2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt33.jpg?w=300" medium="image">
			<media:title type="html">GWT3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt43.jpg?w=300" medium="image">
			<media:title type="html">GWT4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt51.jpg?w=300" medium="image">
			<media:title type="html">GWT5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt61.jpg" medium="image">
			<media:title type="html">GWT6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt71.jpg?w=300" medium="image">
			<media:title type="html">GWT7</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt81.jpg?w=300" medium="image">
			<media:title type="html">GWT8</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2010/01/gwt91.jpg?w=300" medium="image">
			<media:title type="html">GWT9</media:title>
		</media:content>
	</item>
		<item>
		<title>Criando e hospedando uma aplicação no App Engine</title>
		<link>http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/</link>
		<comments>http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 17:03:03 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[App Engine]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=397</guid>
		<description><![CDATA[Olá a todos,                 Nesse post faremos nossa primeira abordagem no App Engine. Como já dito anteriormente o App Engine é a plataforma para Cloud Computing da Google. Nessa plataforma, que já é utilizada pelas aplicações do Google, podemos hospedar &#8230; <a href="http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=397&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="mceTemp mceIEcenter">
<div class="mceTemp mceIEcenter" style="text-align:left;">
<p>Olá a todos,</p>
<p>                Nesse post faremos nossa primeira abordagem no <a href="http://www.appengine.com/">App Engine</a>. Como já dito anteriormente o App Engine é a plataforma para Cloud Computing da Google. Nessa plataforma, que já é utilizada pelas aplicações do Google, podemos hospedar nossas aplicações que podem ser construídas em Phyton ou Java. Nesse post demonstraremos como criar uma aplicação simples, executá-la no ambiente de desenvolvimento e enviá-la para a nuvem na plataforma App Engine.</p>
<p>                Começaremos criando nosso projeto utilizando o Eclipse como IDE através do menu File, opção New e em seguida Web Application Project. Após acessada essa opção no menu é aberta a tela para informamos os dados do projeto, como nome, nome do pacote (semelhante ao namespace em .Net) e se utilizaremos alguns dos recursos disponíveis. Nos recursos disponíveis podemos escolher utilizar o <a href="http://code.google.com/intl/pt-BR/webtoolkit/">Google Web Toolkit</a> (GWT) que é um recurso para construirmos a camada de apresentação e a comunicação com o lado servidor, semelhante aos Prism em <a href="http://www.silverlight.net/">Silverlight</a>. Outra opção que podemos escolher é selecionar qual a versão do App Engine que utilizaremos em nossa solução.</p>
</div>
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine1.jpg"><img class="size-medium wp-image-381" title="IniciandoAppEngine1" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine1.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a></dt>
<dd class="wp-caption-dd">Criando o projeto com o Plugin para o Eclipse</dd>
</dl>
</div>
<div id="attachment_382" class="wp-caption aligncenter" style="width: 275px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine2.jpg"><img class="size-medium wp-image-382" title="IniciandoAppEngine2" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine2.jpg?w=265&#038;h=300" alt="" width="265" height="300" /></a><p class="wp-caption-text">Opcoes de um novo projeto</p></div>
<p>Quando utilizamos o <em>template</em> do Pluging para o Eclipse já é criada uma estrutura de projeto como a mostrada abaixo. Nela temos a pasta war onde ficam os arquivos de configuração da nossa aplicação e a página inicial. Temos também uma estrutura chamada src onde ficam os arquivos com o código-fonte.</p>
<div id="attachment_383" class="wp-caption aligncenter" style="width: 289px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine3.jpg"><img class="size-full wp-image-383" title="IniciandoAppEngine3" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine3.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Estrutura do projeto</p></div>
<p>A página índex.html que está na pasta war é a página inicial, porém o arquivo que será a página inicial pode ser alterada no arquivo web.xml. Na página índex.html temos um link que quando clicamos somos redirecionados para o servlet que contém o nosso código. O código que será executado está no arquivo HelloWorldSerlet.java e no momento ele escreve <em>HelloWorld</em> no browser. Poderemos alterar a vontade esse código, porém para a finalidade desse post deixarei como criado pelo Plugin.</p>
<div id="attachment_385" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine41.jpg"><img class="size-medium wp-image-385" title="IniciandoAppEngine4" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine41.jpg?w=300&#038;h=91" alt="" width="300" height="91" /></a><p class="wp-caption-text">Codigo do servlet</p></div>
<p>O próximo passo é executarmos localmente a aplicação em modo Debug através do menu Run selecionando a opção Debug, ou apertando a tecla F11. </p>
<div id="attachment_386" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine5.jpg"><img class="size-medium wp-image-386" title="IniciandoAppEngine5" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine5.jpg?w=300&#038;h=168" alt="" width="300" height="168" /></a><p class="wp-caption-text">Iniciando o debug da aplicacao</p></div>
<p>Note que após um processamento aparecerá uma mensagem na janela Console indicando o endereço da nossa aplicação porém não é aberto nenhum browser. Para ver o funcionamento da aplicação deveremos abrir o browser e acessar o endereço informado na janela Console. Nesse modo poderemos inserir <em>break points</em> e depurar nossa aplicação. Outra característica desse ambiente é que não precisamos reprocessar a aplicação quando alteramos pois as alterações são assumidas automaticamente quando o código é executado novamente.</p>
<div id="attachment_387" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine6.jpg"><img class="size-medium wp-image-387" title="IniciandoAppEngine6" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine6.jpg?w=300&#038;h=70" alt="" width="300" height="70" /></a><p class="wp-caption-text">Endereço da aplicacao na maquina local</p></div>
<div id="attachment_388" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine7.jpg"><img class="size-medium wp-image-388" title="IniciandoAppEngine7" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine7.jpg?w=300&#038;h=215" alt="" width="300" height="215" /></a><p class="wp-caption-text">Executando a aplicacao localmente</p></div>
<p>Agora vamos realizar o <em>deploy</em> da nossa pequena aplicação. Entretanto primeiro devemos criar a aplicação e reservar o espaço para ela nos servidores do Google através do <a href="http://appengine.google.com/">portal do App Engine</a>. Após realizar o login podemos criar a aplicação e reservar espaço para ela clicando no botão <em>Create na Application</em>. Seremos direcionados para uma tela onde deveremos informar o ID e nome da aplicação. Nesse ponto devemos tomar cuidado pois o ID da aplicação será o seu endereço e após criada não poderemos mais excluí-la, ocupando o espaço de uma das 10 aplicações possíveis de serem criadas na conta grátis. </p>
<div id="attachment_389" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine8.jpg"><img class="size-medium wp-image-389" title="IniciandoAppEngine8" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine8.jpg?w=300&#038;h=215" alt="" width="300" height="215" /></a><p class="wp-caption-text">Criando uma aplicacao na nuvem do App Engine</p></div>
<div id="attachment_390" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine9.jpg"><img class="size-medium wp-image-390" title="IniciandoAppEngine9" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine9.jpg?w=300&#038;h=215" alt="" width="300" height="215" /></a><p class="wp-caption-text">Informando os dados de uma nova aplicacao</p></div>
<p>Reservado o espaço devemos voltar ao nosso projeto onde devemos alterar a propriedade application com o ID da nossa aplicação no App Engine. Essa propriedade de configuração é encontrada no arquivo appengine-web.xml que fica na pasta war\WEB-INF\lib. É através desse ID que a ferramenta de <em>upload</em> ou o Plugin para o Eclipse saberá em que aplicação ela realizá o <em>deploy</em> do nosso projeto.</p>
<div id="attachment_391" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine11.jpg"><img class="size-medium wp-image-391" title="IniciandoAppEngine11" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine11.jpg?w=300&#038;h=214" alt="" width="300" height="214" /></a><p class="wp-caption-text">Configurando o projeto para upload no App Engine</p></div>
<p>Alterada essa propriedade podemos então realizar o <em>deploy</em> clicando no botão com o símbolo do App Engine. Será aberta uma janela onde devermos informar o nome do projeto, nosso login e senha do App Engine. Informados esses dados devemos clicar no botão <em>Deploy</em> para iniciar o <em>upload</em> da aplicação. Finalizado esse processo temos nosso projeto publicado na nuvem e pronto para ser utilizado.</p>
<div id="attachment_392" class="wp-caption aligncenter" style="width: 175px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine12.jpg"><img class="size-full wp-image-392" title="IniciandoAppEngine12" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine12.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Iniciando o deploy pelo Eclipse</p></div>
<div id="attachment_393" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine13.jpg"><img class="size-medium wp-image-393" title="IniciandoAppEngine13" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine13.jpg?w=300&#038;h=191" alt="" width="300" height="191" /></a><p class="wp-caption-text">Informando os dados para iniciar o deploy</p></div>
<div id="attachment_394" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine14.jpg"><img class="size-medium wp-image-394" title="IniciandoAppEngine14" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine14.jpg?w=300&#038;h=142" alt="" width="300" height="142" /></a><p class="wp-caption-text">Deploy iniciado</p></div>
<div id="attachment_395" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine15.jpg"><img class="size-medium wp-image-395" title="IniciandoAppEngine15" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine15.jpg?w=300&#038;h=173" alt="" width="300" height="173" /></a><p class="wp-caption-text">Abrindo a aplicacao na nuvem</p></div>
<div id="attachment_396" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine16.jpg"><img class="size-medium wp-image-396" title="IniciandoAppEngine16" src="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine16.jpg?w=300&#038;h=132" alt="" width="300" height="132" /></a><p class="wp-caption-text">Testando a aplicacao na nuvem</p></div>
<p>Nesse post passamos pelos passos básicos para criar um projeto para o App Engine com o auxilio do Plugin para o Eclipse. Em post futuros continuaremos explorando as funcionalidades dessa plataforma. Como sempre deixei uma cópia dos fontes utilizados nesse post no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a>, nesse caso com o nome AppEngine – HelloWorld.zip.</p>
<p>Abraço a todos e até o próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/397/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/397/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/397/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=397&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2009/12/11/criando-e-hospedando-uma-aplicacao-no-app-engine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine1.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine2.jpg?w=265" medium="image">
			<media:title type="html">IniciandoAppEngine2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine3.jpg" medium="image">
			<media:title type="html">IniciandoAppEngine3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine41.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine5.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine6.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine7.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine7</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine8.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine8</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine9.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine9</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine11.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine11</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine12.jpg" medium="image">
			<media:title type="html">IniciandoAppEngine12</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine13.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine13</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine14.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine14</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine15.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine15</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/12/iniciandoappengine16.jpg?w=300" medium="image">
			<media:title type="html">IniciandoAppEngine16</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight: Consumindo serviços WCF em outros domínios</title>
		<link>http://flaviomoraes.wordpress.com/2009/11/30/silverlight-consumindo-servicos-wcf-em-outros-dominios/</link>
		<comments>http://flaviomoraes.wordpress.com/2009/11/30/silverlight-consumindo-servicos-wcf-em-outros-dominios/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:41:50 +0000</pubDate>
		<dc:creator>flaviomoraes</dc:creator>
				<category><![CDATA[Camada de Apresentação]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Windows Azure]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[desenvolvimento]]></category>

		<guid isPermaLink="false">http://flaviomoraes.wordpress.com/?p=361</guid>
		<description><![CDATA[Olá a todos,                 Nesse post demonstraremos como uma consumir um serviço WCF a partir de uma aplicação desenvolvida em Silverlight no contexto em que estão hospedados em domínios diferentes. A explicação de como consumir um serviço WCF em Silverlight &#8230; <a href="http://flaviomoraes.wordpress.com/2009/11/30/silverlight-consumindo-servicos-wcf-em-outros-dominios/">Continue lendo <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=361&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>                Nesse post demonstraremos como uma consumir um serviço WCF a partir de uma aplicação desenvolvida em Silverlight no contexto em que estão hospedados em domínios diferentes. A explicação de como <a href="http://flaviomoraes.wordpress.com/2009/11/12/consumindo-servicos-wcf-em-silverlight/">consumir um serviço WCF em Silverlight</a> já foi abordada em outro post, porém nele nos limitamos hospedando o serviço e o consumidor no mesmo local de origem. Para montar a estrutura necessária para esse exemplo utilizarei duas roles do Windows Azure, portanto também demonstraremos como hospedar aplicações WCF e Silverlight no Windows Azure com o CTP de novembro, que trouxe algumas mudanças.</p>
<p>                Antes de iniciarmos nosso exemplo precisamos entender o motivo e como funciona a restrição no consumo de aplicações em outros domínios. Na verdade a restrição não é apenas para outros domínios, mas sim para outros “locais de origem”. Um local de origem nesse contexto é o conjunto de domínio, protocolo de comunicação e porta acessada. Essa regra existe nos browsers como medida de segurança para códigos JavaScript não acessarem recursos de outros locais de origem que possam ser maliciosos. Portanto ela é aplicada para aplicações desenvolvidas em Silverlight, Flash ou qualquer outra ferramenta que faça uso de JavaScript para acessar recursos na web. Logo quando temos uma aplicação desenvolvida em Silverlight e desejarmos acessar um serviço WCF ou outro recurso que esteja exposto em outro domínio, porta ou que utilize outro protocolo de comunicação nos depararemos com essa medida de segurança.</p>
<p>                Para lidarmos com essa restrição temos duas alternativas. A primeira é colocarmos um serviço WCF ou outro recurso no mesmo local de origem da aplicação Silverlight que consuma o serviço original que está no outro local de origem. A segunda alternativa é possibilitarmos o consumo desse recurso através da inclusão dos arquivos <em>crosssdomain.xml</em> e <em>clientaccesspoliciy.xml</em>. Porém esses arquivos devem ser adicionados no servidor que expõem o serviço, logo deveremos ter acesso a esse servidor ou ao publicador do serviço para adicioná-lo, caso contrário nos restará somente a primeira opção. O arquivos <em>clientaccesspolicy.xml</em> é exclusivo para aplicações escritas em Silverlight, já o arquivo <em>crossdomain.xml</em> pode ser utilizado para permitir ou restringir o acesso a qualquer aplicação que tente acessar o recurso através de JavaScript.</p>
<p>                Vamos agora iniciar o nosso exemplo que será um projeto do tipo <em>Windows Azure Cloud Service</em> e terá uma <em>ASP .Net Web Role</em> para hospedar a aplicação escrita em Silverlight e uma <em>WCF Service Web Role</em> para hospedar o serviço WCF. A aplicação será a mesma utilizada na demonstração de <a href="http://flaviomoraes.wordpress.com/2009/11/12/consumindo-servicos-wcf-em-silverlight/">consumo de serviço WCF por aplicações em Silverlight no mesmo local de origem</a>.</p>
<div id="attachment_356" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio1.jpg"><img class="size-medium wp-image-356" title="SilverlightDominio1" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio1.jpg?w=300&#038;h=213" alt="" width="300" height="213" /></a><p class="wp-caption-text">Criando o projeto principal</p></div>
<div id="attachment_357" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio2.jpg"><img class="size-medium wp-image-357" title="SilverlightDominio2" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio2.jpg?w=300&#038;h=187" alt="" width="300" height="187" /></a><p class="wp-caption-text">Adicionando as web roles na solucao</p></div>
<div id="attachment_377" class="wp-caption aligncenter" style="width: 173px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio31.jpg"><img class="size-medium wp-image-377" title="SilverlightDominio3" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio31.jpg?w=163&#038;h=300" alt="" width="163" height="300" /></a><p class="wp-caption-text">Estrutua inicial da solucao</p></div>
<p>Após criada a solução com os projetos devemos adicionar também o projeto da aplicação Silverlight. Durante esse processo devemos indicar para o <em>Visual Studio</em> que desejamos hospedar esse projeto na <em>ASP .Net Web Role</em>:</p>
<div id="attachment_359" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio4.jpg"><img class="size-medium wp-image-359" title="SilverlightDominio4" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio4.jpg?w=300&#038;h=191" alt="" width="300" height="191" /></a><p class="wp-caption-text">Adicionando o projeto da aplicacao Silverlight</p></div>
<div id="attachment_360" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio5.jpg"><img class="size-medium wp-image-360" title="SilverlightDominio5" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio5.jpg?w=300&#038;h=268" alt="" width="300" height="268" /></a><p class="wp-caption-text">Hospedando a aplicacao Silverlight na Web Role</p></div>
<div id="attachment_363" class="wp-caption aligncenter" style="width: 139px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio61.jpg"><img class="size-medium wp-image-363" title="SilverlightDominio6" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio61.jpg?w=129&#038;h=300" alt="" width="129" height="300" /></a><p class="wp-caption-text">Estrutura da solucao com o projeto silverlight</p></div>
<p>Em seguida vamos modificar a página principal do projeto Web para expor a aplicação Silverlight. Vamos utilizar o mesmo código já desenvolvido em outro <a href="http://flaviomoraes.wordpress.com/2009/11/12/consumindo-servicos-wcf-em-silverlight/">post</a>.</p>
<div id="attachment_364" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio7.jpg"><img class="size-medium wp-image-364" title="SilverlightDominio7" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio7.jpg?w=300&#038;h=73" alt="" width="300" height="73" /></a><p class="wp-caption-text">Codigo da pagina que hospeda a aplicacao Silverlight</p></div>
<div id="attachment_366" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio81.jpg"><img class="size-medium wp-image-366" title="SilverlightDominio8" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio81.jpg?w=300&#038;h=120" alt="" width="300" height="120" /></a><p class="wp-caption-text">XAML da aplicacao Silverlight</p></div>
<p>Partiremos agora para a construção do Serviço WCF que será hospedado na outra <em>Web Role</em> e que será disponibilizado em outra porta, portanto estará em outro local de origem. Nesse serviço teremos o mesmo método do <a href="http://flaviomoraes.wordpress.com/2009/11/12/consumindo-servicos-wcf-em-silverlight/">post anterior sobre consumo de serviços WCF por aplicações Silverlight</a>. Para essa tarefa vamos remover o serviço inicial disponibilizado pelo <em>template</em> e adicionar outro item do tipo <em>Silverlight-enabled WCF Service</em>: </p>
<div id="attachment_367" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio9.jpg"><img class="size-medium wp-image-367" title="SilverlightDominio9" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio9.jpg?w=300&#038;h=180" alt="" width="300" height="180" /></a><p class="wp-caption-text">Adicionando o servico na Web Role</p></div>
<div id="attachment_368" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio10.jpg"><img class="size-medium wp-image-368" title="SilverlightDominio10" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio10.jpg?w=300&#038;h=130" alt="" width="300" height="130" /></a><p class="wp-caption-text">Codigo do servico WCF</p></div>
<p>Para finalizar a estrutura devemos adicionar a referência do serviço WCF na aplicação Silverlight. Para isso clique com o botão da direita sobre o projeto Silverlight e selecione a opção <em>Add Service Reference</em> e em seguida clique no botão <em>Discover</em>:</p>
<div id="attachment_369" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio11.jpg"><img class="size-medium wp-image-369" title="SilverlightDominio11" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio11.jpg?w=300&#038;h=241" alt="" width="300" height="241" /></a><p class="wp-caption-text">Adicionando a referencia do servico na aplicacao Silverlight</p></div>
<p>Agora adicionaremos o código para consumir o serviço a partir da aplicação Silverlight e em seguida tentaremos consumir o serviço. </p>
<div id="attachment_370" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio12.jpg"><img class="size-medium wp-image-370" title="SilverlightDominio12" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio12.jpg?w=300&#038;h=107" alt="" width="300" height="107" /></a><p class="wp-caption-text">Codigo da aplicacao Silverlight</p></div>
<p>Porém como ainda não adicionamos os arquivos que permitem o consumo do serviço por código JavaScript de outros locais de origem nos deparamos com a seguinte exceção: <em>System.ServiceModel.CommunicationException was unhandled by user code  Message=&#8221;An error occurred while trying to make a request to URI &#8216;http://localhost:8080/TesteSL.svc&#8217;. </em><em>This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details.&#8221;</em></p>
<div id="attachment_371" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio13.jpg"><img class="size-medium wp-image-371" title="SilverlightDominio13" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio13.jpg?w=300&#038;h=116" alt="" width="300" height="116" /></a><p class="wp-caption-text">Mensagem de erro ao consumir recurso em outro local de origem</p></div>
<p> A origem dessa exceção não o nosso código Silverlight ou WCF, mas sim a segurança do browser que não permite que um código JavaScript consuma recursos de outros locais de origem. Para permitir o consumo do serviço por nossa aplicação deveremos colocar os arquivos <em>crossdomain.xml</em> e <em>clientaccesspolicy.xml </em>no diretório raiz do site/aplicação que hospeda o serviço, no nosso caso a web role.</p>
<div id="attachment_373" class="wp-caption aligncenter" style="width: 234px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio16.jpg"><img class="size-full wp-image-373" title="SilverlightDominio16" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio16.jpg?w=500" alt=""   /></a><p class="wp-caption-text">Arquivos clientaccesspolicy.xml e crossdomain.xml adicionados no projeto</p></div>
<div id="attachment_374" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio141.jpg"><img class="size-medium wp-image-374" title="SilverlightDominio14" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio141.jpg?w=300&#038;h=183" alt="" width="300" height="183" /></a><p class="wp-caption-text">Conteudo do arquivo clientaccesspolicy.xml</p></div>
<p>Note que no arquivo <em>clientaccesspolicy.xml</em> podemos definir quais URIs poderão acessar o recurso, no nosso caso o serviço WCF, além de configurar também quais os diretórios estarão acessíveis a essas URIs. Já no arquivo <em>crossdomain.xml</em> configuramos somente quais domínios terão acesso aos nossos recursos. </p>
<div id="attachment_375" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio15.jpg"><img class="size-medium wp-image-375" title="SilverlightDominio15" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio15.jpg?w=300&#038;h=39" alt="" width="300" height="39" /></a><p class="wp-caption-text">Conteudo do arquivos crossdomain.xml</p></div>
<p>Adicionados os arquivos no projeto vamos testar novamente a solução, que funcionará corretamente.</p>
<div id="attachment_376" class="wp-caption aligncenter" style="width: 310px"><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio17.jpg"><img class="size-medium wp-image-376" title="SilverlightDominio17" src="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio17.jpg?w=300&#038;h=180" alt="" width="300" height="180" /></a><p class="wp-caption-text">Aplicacao funcionando corretamente</p></div>
<p>Com isso temos nossa aplicação Silverlight consumindo um serviço WCF em outro local de origem, que poderia ser em outro domínio também, desde que no servidor que hospeda o serviço tenhamos os arquivos para permitir o seu consumo. Como sempre deixei no meu <a href="http://cid-a968bff8abeea565.skydrive.live.com/browse.aspx/Fontes%20do%20Blog?authkey=vXJ2zoIesLo%24">Sky Drive</a> os fontes utilizados para escrever o post, nesse caso o arquivo está com o nome LocaisOrigem.zip</p>
<p>Abraço a todos e até o próximo post.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio6.jpg"></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/flaviomoraes.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/flaviomoraes.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/flaviomoraes.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/flaviomoraes.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/flaviomoraes.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/flaviomoraes.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/flaviomoraes.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/flaviomoraes.wordpress.com/361/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=flaviomoraes.wordpress.com&amp;blog=7320681&amp;post=361&amp;subd=flaviomoraes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://flaviomoraes.wordpress.com/2009/11/30/silverlight-consumindo-servicos-wcf-em-outros-dominios/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/03a6f9f966b1422dc544d2e200e0db49?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">flaviomoraes</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio1.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio1</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio2.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio2</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio31.jpg?w=163" medium="image">
			<media:title type="html">SilverlightDominio3</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio4.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio4</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio5.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio5</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio61.jpg?w=129" medium="image">
			<media:title type="html">SilverlightDominio6</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio7.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio7</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio81.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio8</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio9.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio9</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio10.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio10</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio11.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio11</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio12.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio12</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio13.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio13</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio16.jpg" medium="image">
			<media:title type="html">SilverlightDominio16</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio141.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio14</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio15.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio15</media:title>
		</media:content>

		<media:content url="http://flaviomoraes.files.wordpress.com/2009/11/silverlightdominio17.jpg?w=300" medium="image">
			<media:title type="html">SilverlightDominio17</media:title>
		</media:content>
	</item>
	</channel>
</rss>
