WCF + Silverlight: Utilizando REST e JSON em serviços

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. 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.

REST é um protocolo de comunicação sendo uma alternativa ao protocolo SOAP, há um post interessante do Waldemir 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.

                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.

                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 Namespace e Name 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.

 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á HTTP://localhost:8080/MeuServico/123, 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.

Codigo do contrato do servico

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.

Codigo da classe para tafegaros objetos

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.

Codigo do servico

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.

Trecho do arquivo web.config com as configuracoes do servio

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.

Barra de endereco do browse com a URL inicial do projeto

Barra de endereco do browser com a URI para chamada do servico

Break point para acompanhar a chamada do servico

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.

Alterando as propriedades do projeto WEB

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.

Codigo XAML da aplicacao Silverlight

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.

Codigo para realizar a chamada ao servico

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.

Codigo para receber e tratar a resposta do servico

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 Sky Drive com o nome WCF_JSON.zip.

Teste da aplicacao

Abraços a todos e até o próximo post!

3 respostas para WCF + Silverlight: Utilizando REST e JSON em serviços

  1. Excelente post. Muito bem explicado.

  2. Wilson de Oliveira

    parabens, muito bom seu post, o melhor até agora em nosso idioma em minha opinião

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s