.NET  - Apresentando WCF Data Services


O WCF Data Services ou Windows Communication Foundation Data Services (originalmente conhecido como ADO .NET Data Services) é um framework que pode ser usado para expor uma camada de dados via interface REST usando JSON ou Atom como formato de saída.

Por ser uma tecnologia nova alguns termos usados podem gerar dúvidas para quem esta iniciando o aprendizado por isso possuir conceitos sobre  web services , WCF e ADO .NET Data Services vai ajudar muito no entendimento dos recursos apresentados neste artigo. Sugestão : Vejas as referências no final do artigo.

O WCF Data Services permite a criação e o consumo de serviços de dados para Web ou para Intranet através da utilização do protocolo Open Data (OData). O protocolo OData permite que você exponha a sua fonte de dados como um recurso que é endereçável via URI. Isto permite o acesso e a alteração de dados através da semântica REST - Representation State Transfer, mais especificamente os comandos HTTP padrão: GET, PUT, POST e DELETE.

O Open Data Protocol (OData) é um protocolo para consulta e atualização de dados na web, sendo um conjunto de extensões para o protocolo AtomPub.

O AtomPub é um protocolo baseado em HTTP usado para o mesmo fim, criar e atualizar os recursos da web, trabalhando em conjunto com o
Atom Syndication Format
, uma linguagem baseada em XML, usado para a web feeds.

OData anteriormente era conhecido como Protocolo Astoria Protocol, protocolo ADO.NET Data Services ou como um conjunto de convenções / extensões para AtomPub.

Obs: o Google usa o protocolo Gdata.

A seguir temos o diagrama que ilustra a arquitetura dos WCF Data Services para exposição de  feeds OData:

Podemos usar o WCF Data Services para expor qualquer fonte de dados com suporte a consultas LINQ, ou seja, que implemente IQueryable/IUpdatable, através de uma interface RESTful a aplicação pede um endereço para o serviço e o endereço é traduzido como uma consulta LINQ que retorna os dados desejados.

O framework Data Services framework  facilita muito a criação de serviços de dados flexíveis que são integrados com a web. O WCF Data Services usa URI's para apontar para porções de dados, isso permite que que formatos de representação como JSON e ATOM, baseados em XML, sejam usados para o transporte de dados.

Esse estilo de programação é conhecido como RESTful e permite a manipulação de coleções via URIs onde os agentes consumidores podem interagir com os dados através de comandos HTTP como GET, POST, PUT ou DELETE.

Pensando dessa forma temos as seguintes possibilidades:

O WCF Data Services cria de forma automática um um Web Service REST-ful que gera uma saída baseada em JSON ou Atom em um configuração fornecida. Dessa forma o desenvolvedor não esta obrigado a criar o Web Service, serializar os dados para JSON ou Atom, tendo assim uma aumento de desempenho no desenvolvimento da aplicação.

Da Teoria a Prática

Creio que um exemplo prático simples vai ajudar a esclarecer melhor os conceitos sobre o WCF Data Services.

No exemplo deste artigo vamos usar o WCF Data Services para expor uma camada de dados gerada pelo Entity Framework e realizar consultas nos dados via URI sem ter que escrever nenhum método para isso. Confira...

Para atingir nosso objetivo vamos seguir as seguintes etapas:

  1. Criar uma aplicação ASP.NET Web;
  2. Definir um modelo de dados usando o Entity Data Model a partir do banco de dados Northwind;
  3. Incluir um serviço de dados  na aplicação Web;
  4. Permitir o acesso ao serviço de dados;
  5. Realizar consultas no serviço de dados via URI;

Eu estou usando o Visual Web Developer 2010 Express Edition  como ferramenta para criar os projetos e serviços deste artigo.

Abra o VWD 2010 Express e no menu File selecione New Project;

A seguir selecione o template ASP .NET Web Application e informe o nome Web_Demo_WCF_DS e clique em OK;

2-) A seguir no menu Project selecione Add New Item;

3-) Na janela Add New Item, em Templates selecione ADO .NET Entity Data Model, informe o nome Northwind.edmx e clique em Add;

4-) Seguindo o assistente selecione o item : Generate From DataBase  e clique em Next> ;

5-) Na próxima janela do assistente selecione a conexão com o banco de dados Northwind.mdf aceite o nome NorthwindEntities e clique em Next> ;

6-) Na próxima janela selecione as tabelas: Categories, Customers, Order, Order Details e Products ;  aceite o nome para Model Namespace como NorthwindModel, e clique no botão Finish;

Abaixo temos o modelo conceitual representado graficamente no descritor do EF. Além disso foi gerado o ObjectContext que gerencia o estado dos objetos e permite realizar operações CRUD :

Vamos agora criar no serviço de dados.No menu Project selecione Add New Item e a seguir selecione o template WCF Data Service e informe o nome Wcf_Northwind_DS.svc e clique em Add;

Dessa forma temos o nosso serviço de dados do tipo WCF Data Service criado.

Até o momento temos o modelo de entidades gerado e o serviço de dados criado. Precisamos informar o serviço de dados qual o contexto que estamos usando e o que ele vai poder disponibilizar.

Para isso abr o arquivo do serviço criado e no lugar de [[class name]] informe o nome do nosso modelo de entidades: NorthwindEntities criado pelo Entity Framework;

Descomente também a linha de código :  config.SetEntitySetAccessRule("MyEntitySet", EntitySetRights.All)

Substituindo a palavra MyEntitySet por um asterísco (*);

config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead)   ==>  config.SetEntitySetAccessRule("*", EntitySetRights.All)

Na figura baixo temos como deve ficar o código após essas alterações

Com essas alterações informamos ao nosso serviço de dados qual é a classe que contém o mapeamento para as nossas entidades, no caso NorthwindEntities; e também definimos que não haverá restrição a nenhuma entidade : “EntitySetRights.All”

Executando o projeto iremos obter a seguinte página referente ao nosso serviço de dados:

Observe que o nosso serviço de dados WCF listou todas as nossas entidades: Categories, Customers, Order_Details, Orders, Products.

Lembra que dissemos que uma característica de um serviço WCF  é aceitar consultas via URI ?

Pois é isso que vamos fazer...

Para ver todos os Clientes digite a seguinte URI: http://localhost:7410/Wcf_Northwind_DS.svc/Customers

O resultado exibido será o seguinte:

Para melhor visualizarmos o resultado vamos desativar o modo de exibição de Feeds do navegador Internet Explorer.

Selecione : Ferramentas -> Opções da Internet,  e na janela Opções da Internet abra a aba Conteúdo e clique em Configurações para Feeds e Web Services;

Em seguida desmarque a  opção : Ativar o modo de exibição de leitura de feed, conforme mostra a figura abaixo:

Após isso clique OK até confirmar as alterações e refazendo a execução da URL iremos obter a relação dos Clientes no formato XML conforme a figura abaixo:

Observe que cada cliente possui uma referência única que no caso refere-se a chave primária da tabela Customers. Para visualizar um cliente particular basta usar esta referência na URI digitando:  http://localhost:7410/Wcf_Northwind_DS.svc/Customers('ALFKI')

O resultado é mostrado a seguir:

Deseja ver os pedidos deste cliente ?

Então digite: http://localhost:7410/Wcf_Northwind_DS.svc/Customers('ALFKI')/Orders

E veja o resultado:

Vamos agora exibir os valores para a entidade categories, mais especificamente para a primeira categoria.

Digite a URI: http://localhost:7410/Wcf_Northwind_DS.svc/Categories(1)

Iremos obter o seguinte resultado:

Se desejarmos exibir a figura que esta no formato binário no campo Picture basta digitar:

http://localhost:7410/Wcf_Northwind_DS.svc/Categories(1)/Picture/$value

Deseja filtrar os clientes por cidade ?

Vamos exibir somente os clientes de Londres , para isso digite:

http://localhost:7410/Wcf_Northwind_DS.svc/Customers?$filter=City eq 'London'

O resultado será:

Eu poderia continuar mas creio que você já percebeu todo o poder das consultas dos serviços de dados WCF.

Operações suportada por um WCF Data Service:
orderby - realiza a ordenação por um parâmetro qualquer
top - seleciona a quantidade de registros informada
filter - realiza a pesquisa com base em algum filtro
value - exibe um valor

Operadores suportados:

eq - igual
ne - não igual
gt - maior que
ge - maior ou igual
lt - menor que
le - menor ou igual
and - AND lógico
or - OR lógico
not - NOT lógico

Além de permitir realizar consultas via URI o WCF Data Services permite também que você consulte um serviço de dados a partir de uma aplicação cliente baseada no .NET Framework usando as classes geradas pelo serviço de dados. Você pode executar essas consultas usando os seguintes métodos:

  1. Executando uma consulta LINQ contra o DataServiceQuery que você obtém a partir do DataServiceContext que a ferramenta Add Data Service Reference gera;
  2. De forma implícita, pela enumeração sobre o DataServiceQuery  que você obtém a partir do DataServiceContext  que a ferramenta Add Data Service Reference gera;
  3. Explicitamente, chamando o método Execute no DataServiceQuery   ou o método BeginExecute para execução assíncrona;

Obs1 : Um DataServiceQuery representa uma simples requisição de consulta a um serviço de dados (data service);
Obs2 : Um DataServiceContext representa um contexto em tempo de execução de um serviço de dados (data service)

No exemplo a seguir temos um trecho de código que mostra como usar um DataServiceContext para explicitamente executar uma consulta que retorna todos os clientes (customers) de um serviço de dados gerado para o banco de dados Northwind:

' Define uma requisição URI que retorna os clientes
Dim customersUri = New Uri(svcUri, "Northwind.svc/Customers")

' Cria um DataServiceContext usando o serviço URI.
Dim context = New DataServiceContext(svcUri)

Try
   ' Percorre o resutlado da consulta
   For Each customer As Customer In context.Execute(Of Customer)(customersUri)
      Console.WriteLine("Nome do Cliente: {0}", customer.CompanyName)
    Next
Catch ex As DataServiceQueryException
    Throw New ApplicationException("Ocorreu um erro durante a execução da consutla.", ex)
End Try
 

Este é apenas um exemplo de como usar os recursos do serviços de dados , aguarde em outro artigo onde eu mostrarei como efetivamente consumir os WCF Data Services.

Até o próximo artigo WCF Data Services...

Veja os Destaques e novidades do SUPER DVD Visual Basic  (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Veja também os Cursos com vídeo aulas e projetos exemplos:

 

    João 8:45 Mas porque eu digo a verdade, não me credes.

    João 8:46 Quem dentre vós me convence de pecado? Se digo a verdade, por que não me credes?

    João 8:47 Quem é de Deus ouve as palavras de Deus; por isso vós não as ouvis, porque não sois de Deus.

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti