Nesse post vamos apresentar como consumir serviços WCF a partir de uma aplicação desenvolvida em Silverlight. Antes de apresentarmos o exemplo vamos lembrar algumas questões relacionadas a esse cenário e apresentar algumas diferenças entre consumir um serviço através de uma aplicação escrita em Silverlight e aplicações desenvolvidas em outras tecnologias.
A primeira questão é porque a aplicação deve ser desenvolvida em Silverlight? Na plataforma Microsoft podemos desenvolver nossas aplicações Web utilizando ASP.Net, tanto no modo tradicional como através do modelo MVC, ou em Silverlight. Para aplicações simples que não necessitem de uma interface rica com o usuário é recomendável o uso do ASP .Net na forma tradicional devido a sua simplicidade e velocidade de construção. Para camadas de apresentação com lógica mais complexa, cujos componentes podem ser reaproveitados para simplificar a solução e reduzir o tempo de desenvolvimento, porém a interatividade com o usuário continua simples é recomendado o modelo MVC. A tecnologia Silverlight é recomendada quando precisamos de uma aplicação Web com uma interface rica, com recursos próximos de uma aplicação Desktop.
Uma segunda questão é onde desenvolveremos nossas regras de negócio. Embora seja possível escrever regras de negócio, acessarmos base de dados e outros recursos com o uso de Silverlight não temos disponíveis nessa tecnologia todos os recursos da plataforma .Net. Além dessa restrição técnica devemos lembrar que é boa prática separarmos a camada de negócio da camada de apresentação. Essa separação nos permite reaproveitar funcionalidades e simplifica a solução além de permitir a evolução das camadas de forma independente.
Na plataforma Microsoft podemos desenvolver nossa camada de negócio utilizando componentes COM+, Web Services ASP.Net ou Serviços WCF. O COM+ é uma tecnologia madura, porém seu uso restringe a integração de nossas aplicações somente a sistemas desenvolvidos para a plataforma Microsoft. Essas restrição ocorre pois essa tecnologia utiliza um protocolo de comunicação proprietário. Os Web Services ASP .Net são simples de desenvolver, porém permitem comunicação apenas através do protocolo Http na porta 80 e tem poucos mecanismos de segurança . A tecnologia WCF, entretanto, nos permite desenvolver aplicações que disponibilizam suas funcionalidades através de diversos protocolos de comunicação em diferentes endereços, além de possuir um mecanismo de segurança mais robusto que os Web Services ASP .Net.
Aplicações escritas em Silverlight não podem utilizar componentes COM+, pois essa tecnologia não é suportada em Silverlight. Outro motivo para o não uso de COM+ nessa tecnologia é que aplicações escritas em Silverlight são executadas na máquina cliente, onde não podemos registrar componentes. Portanto quando utilizamos Silverlight ficamos restritos aos Web Services ASP .Net ou a serviços WCF. Ao utilizarmos Web Services ASP.NET somos obrigados a instalar o IIS no nosso servidor de aplicação, porém quando utilizamos serviços WCF podemos utilizar Windows Services ou no WAS (disponível somente no Windows 2008) para hospedar nossos serviços. Uma outra vantagem no uso de serviços WCF é a possibilidade de utilizarmos bindings que trafegam as mensagens em formato binário, melhorando a performance da aplicação.
Quando utilizamos aplicações Silverlight para consumir serviços WCF temos três principais diferenças em relação a ASP .Net ou aplicações Desktop. A primeira diferença é sobre os bindings utilizados: em silverlight é possível utilizarmos somente os bindings BasicHttpBinding e o CustomBinding, enquanto nas outras tecnologias é possível utilizarmos todos bindings disponíveis. A segunda diferença está na chamada dos métodos e chegada do resultado: em Silverlight o consumo de serviços WCF é sempre assíncrono, enquanto nas outras tecnologias é possível consumirmos serviços de forma síncrono ou assíncrona. A última diferença é sobre o consumo de serviços WCF que estão em outro domínio. Nessa situação é necessária a inclusão de dois arquivos no servidor em que são executados os serviços para permitir que essas aplicações sejam acessadas por consumidores que estão e outros domínios.
Passaremos agora para a construção do nosso exemplo. Nesse exemplo teremos na mesma solução um projeto do tipo Silverlight Application, que será nossa camada de apresentação, e uma aplicação ASP .Net que hospedará tanto nossa aplicação Silverlight como o serviço WCF. Começaremos essa estrutura adicionando o projeto Silverlight. Após selecionado o tipo de projeto e informado o seu nome e caminho o template nos questiona se desejamos que seja criado um Web Site ou Web Application Project. Para esse exemplo utilizaremos um Web Site:
Ao executarmos pela primeira vez nossa solução nos é informado que o arquivo Web.Config não está configurado para suportar o Debug da aplicação Web. Deixando a primeira opção selecionada o Visual Studio fará as modificações necessárias nesse arquivo para permitir o debu. Após clicar no botão OK dessa janela será iniciada a aplicação Web que hospeda o projeto Silverlight e nesse momento será aberta um Internet Explorer (ou o internet browser configurado como default no visual Studio) com a página em branco. Nessa página está nossa aplicação Silverlight que no momento não contém nenhum controle ou ação.
O último passo para montar a estrutura inicial é adicionar o Serviço WCF. Para isso clique com o botão direito sobre o projeto Web (não o projeto Silverlight) e selecione a opção Add New Item. Será aberta a janela semelhante a da imagem abaixo. Selecione a opção Silverlight-enabled WCF Service e informe um nome para seu serviço. Note que após adicionar o serviço será criado um arquivo com a extensão .svc que contém um outro arquivo com a extensão .cs. O arquivo .cs é a implementação do serviço WCF e o arquivo .svc é o arquivo necessário para hospedarmos nosso serviço no IIS.
Passaremos agora para o desenvolvimento do serviço que terá apenas um método que fará uma pesquisa em uma lista de nomes. O método que realiza a pesquisa receberá uma string e retornará todos os nomes que comecem que essa string. Para simplificar a solução nossa lista de nomes é montada hard-coded toda vez que a classe do serviço é instanciada para evitar complexidades que não são o foco desse post.
Para os leitores que não estão familiarizados com o código, a pesquisa pelos nomes é realizada através de uma query LINQ. Essa tecnologia, que será assunto de muitos outros posts, nos permite realizar pesquisas em coleções de objetos, XMLs, banco de dados e outras fontes de dados.
Criado nosso serviço, vamos referenciá-lo na nossa aplicação Silverlight. Para criar essa referência devemos selecionar o projeto Silverlight e clicar com o botão da direita e selecionar a opção Add Service Reference. Será aberta uma tela para informamos o endereço do serviço que queremos adicionar a referencia. Como nosso serviço está na mesma solução do projeto Silverlight basta clicar no botão Discover. O campo com o endereço do serviço e a lista serão preenchidos com as informações do nosso serviço. Basta selecioná-lo e informar um namespace adequado e em seguida clicar no botão OK.
No final desse processo poderá aparecer a janela de erro da imagem abaixo, que pode ser ignorada.
O próximo passo é desenvolver a interface da aplicação Silverlight. Nesse exemplo adicionamos uma caixa de texto para o usuário informar o início do nome, um botão para disparar a pesquisa e uma lista que recebe o resultado da pesquisa:
Vamos finalmente desenvolver o código para a aplicação Silverlight consumir o serviço WCF e exibir o resultado da pesquisa. O primeiro passo é declarar e criar uma instância da classe Proxy gerada pelo Visual Studio quando adicionamos a referência do serviço. Como o consumo do serviço é assíncrono quando o Proxy receber a resposta do serviço ele disparará um evento. Portanto antes de realizarmos a chamada devemos informar para o Proxy qual o método que deve ser disparado com a resposta do serviço. O nome do EventHandler que deve receber o método a ser disparado é formado pelo nome do método seguido do sufixo “Completed”. A melhor maneira de realizar essa tarefa é criar uma nova instancia do EventHandler, pois o Visual Studio sugere o restante do código. Criada essas estrutura podemos chamar o método do serviço, cujo nome de método no Proxy é formado pelo nome do método seguido do sufixo “Async”. Nada impede de realizarmos essas duas últimas tarefas na ordem inversa, primeiro realizar a chamada para em seguida criar o EventHandle, porém caso ocorra algo na maquina que executa a aplicação Silverlight (máquina cliente) que cause uma lentidão na execução da próxima linha de código a ponto da resposta do serviço chegar antes essa resposta será perdida.
Devemos nos atentar para o período entre o envio da chamada do método e a chegada da resposta na aplicação cliente. Essa atenção é necessária pois o consumo é assíncrono e durante o período mencionado o usuário poderá tomar algumas ações indesejadas, que podem até causar mal funcionamento da aplicação. Portanto temos que verificar quais ações podem ser realizadas pelo usuário e bloquear as demais. Recomendo adicionar também algum sinal de que a aplicação está esperando o resultado do serviço para não dar a impressão para o usuário que a aplicação “travou”.
A parte final do código é passar o resultado da pesquisa para a lista. Essa tarefa é realizada no método que é disparado pelo Proxy após o recebimento da resposta do serviço. Nesse método simplesmente passamos o resultado do método a listbox. O valor de retorno dos métodos de serviços sempre são obtidos através da propriedade Result e os parâmetros passados por referencia ou de output também estão disponíveis no objeto através de propriedades com os seus nomes.
Nesse ponto temos uma aplicação desenvolvida em Silverlight consumindo um serviço WCF. Lembro que nesse exemplo toda a solução é executada no mesmo domínio, dispensando a configuração para consumo de serviços em domínios diferentes do da aplicação. Esses arquivos serão abordados no próximo post sobre Silverlight.
Como sempre deixei uma cópia do exemplo criado no post no meu Sky Drive, com o nome SilverlightWCF.
Abraço a todos e até o próximo post.






































































