CaveAVins Tutoriel 2 : La publication des données en OData avec WCF Data Services
Voici le deuxième tutoriel de la série dans lequel nous mettrons en place la publication des données dans le format OData qui est très interopérable.
Pour cela, nous utiliserons WCF Data Services qui est une implémentation de OData pour .Net.
Nous verrons qu’il est très simple de créer un service WCF Data Services à partir d’un projet Entity Framework.
Articles:
- Développer un projet aujourd’hui : comment faire, par où commencer ?
- Architecture et découpage du projet
- Stockage des données avec Sql Server, EF Code First et Azure
- La publication des données (article correspondant à ce tutoriel )
- La migration dans Azure
- L’application Windows Phone basique
- Ajout de la fonction d’aide à l’achat
- Ajout des notifications sur les vins en promotions
- L’application Silverlight
Tutoriels:
- CaveAVins Tutoriel 1 : L’accès aux données avec Sql Server et EF Code First
- CaveAVins Tutoriel 2 : La publication des données en OData avec WCF Data Services (vous êtes ici )
- CaveAVins Tutoriel 3 : Migration d’une base SQL Server vers SQL Azure
- CaveAVins Tutoriel 4 : Hébergement du service WCF Data Services dans Azure
La version Code First de Entity Framework est très récente et son utilisation entraine encore quelques opérations manuelles dans la configuration du projet pour un bon fonctionnement avec WCF Data Services.
Ce “tuning” manuel représente une grande partie de l’article et vous pourrez heureusement bientôt vous affranchir de ces étapes.
Les prérequis
Pour ce tutoriel, vous aurez besoin d’installer :
- Visual Studio 2010 Express, Premium ou Ultimate (pour tester les diagrammes d’architecture, Use Case, …)
- WCF Data Services 4.0 étant sorti avant EF 4.1, il nous faudra télécharger et installer WCF Data Services 2011 CTP2 qui sait prendre en charge la classe DbContext de EF Code First.
- Nous partons du résultat de notre précédent tutoriel dont vous pouvez télécharger les sources ici:
Création du projet WCF Data Services
- Ouvrez la solution CaveAVins.sln dans Visual Studio 2010
- Dans la solution, ajoutez un projet Web de type ASP.Net Empty Web Application appelé CaveAVins.WebApplication
- Ajoutez un nouvel élément Web de type WCF Data Service dans le projet CaveAVins.WebApplication.
Ajout des références
vers WCF Data Services 2011 CTP2
- Le template WCF Data Service qui vient d’être utilisé n’a pas été mis à jour avec la CTP2 et ne pointe donc pas vers les dernières assemblies. Nous allons y remédier manuellement:
- Supprimez les références vers System.Data.Services et System.Data.Services.Client qui sont de version 4:
- Ajoutez manuellement les mêmes assemblies mais de version supérieure qui se trouvent dans C:\Program Files (x86)\WCF Data Services Mar 2011 CTP2\bin\.NETFramework\
vers Entity Framework 4.1
- Supprimez la référence existante à l’assemblie Entity Framework 4.0 pour en ajouter une vers la version 4.1 de Entity Framework
vers le projet CaveAVins.Db
- Ajoutez une référence vers le projet CaveAVins.Db.
C’est dans ce projet que se trouve la couche ORM Entity Framework et dans lequel se trouve la classe DbContext pour notre cave à vins : CaveAVinsContext.
Codage du service WCF Data Services
- Un nouveau service CaveAVinsDataServices.svc a été crée :
- Ouvrez le fichier CaveAVinsDataService.svc.cs
- Il reste à spécifier le contexte Entity Framework sur lequel s’appuyer : c’est à dire la classe définie dans le tutoriel précédent et qui aggrège nos entités Wines et Bottles sur laquelle nous autorisons des accès complets CRUD:
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
namespace CaveAVins.WebApplication
{
public class CaveAVinsDataService : DataService<CaveAVins.Db.CaveAVinsContext>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Wines", EntitySetRights.All);
config.SetEntitySetAccessRule("Bottles", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
}
- Il faut également modifier la version de WCF Data Services supportée:
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
namespace CaveAVins.WebApplication
{
public class CaveAVinsDataService : DataService<CaveAVins.Db.CaveAVinsContext>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Wines", EntitySetRights.All);
config.SetEntitySetAccessRule("Bottles", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
}
}
C’est fini !
Testons le service
- Définissez le projet Web comme projet de démarrage.
- Spécifiez le service CaveAVinsDataService.svc comme page de démarrage dans les propriétés Web du projet.
Par défaut, le service est hébergé dans le serveur de développement de Visual Studio.
Lancez l’application.
L’adresse “racine” du service https://localhost:5972/CaveAVinsDataService.svc nous renvoie l’index des collections disponibles.
On peut parcourir les données directement dans le browser web, à partir d’une requête OData sur notre service.
Par-exemple : https://localhost:5972/CaveAVinsDataService.svc/Wines/$count permet de compter le nombre d’élements de la liste des vins Wines :
Et pour récupérer la liste des vins et leurs propriétés : https://localhost:5972/CaveAVinsDataService.svc/Wines
Dans l’article dédié à l’authentification, nous verrons comment intercepter les requêtes grâce aux Query Interceptors pour adapter nos réponse en fonction de l’utilisateur qui émet la requête.
L’utilisation du service côté client
WCF Data Services va également nous faciliter l’utilisation de ce service côté client .Net, en nous permettant :
- d’ajouter une référence au service et en générant automatiquement les classes proxy correspondant aux types utilisés dans le service.
Pour la petite histoire, c’est grâce au suffixe $metadata (https://localhost:5972/CaveAVinsDataService.svc/$metadata) que cette opération est possible.
En effet, il permet d’obtenir le dictionnaire des entités et associations utilisés dans le service :
- d’utiliser Linq sur les entités, pour spécifier les requêtes qui seront transformées automatiquement en Uri OData par le provider
Vous trouverez un exemple concret de client Silverlight qui exploite un service WCF Data Services dans l’article Tutoriel : Accéder aux listes Sharepoint 2010 par OData en Silverlight.
Dans cet article, les données proviennent de Sharepoint qui propose un accès OData de ses listes et bibliothèques, mais ça ne change rien en ce qui concerne l’exploitation de ce service côté client.
Architecture réalisée à ce stade
Version On Premises
Un service web WCF Data Services permettant de manipuler les données a été mis en place.
Grâce à lui, les données sont accessibles en OData par toute plateforme cliente qui sait communiquer en http et parser du XML : difficile de faire plus interopérable .
Il est temps à présent de faire bon usage de ces données.
Voici les sources à l’issue de ce second tutoriel:
Rendez vous après quelques vacances pour la suite !
Articles:
- Développer un projet aujourd’hui : comment faire, par où commencer ?
- Architecture et découpage du projet
- Stockage des données avec Sql Server, EF Code First et Azure
- La publication des données (article correspondant à ce tutoriel )
- La migration dans Azure
- L’application Windows Phone basique
- Ajout de la fonction d’aide à l’achat
- Ajout des notifications sur les vins en promotions
- L’application Silverlight
Tutoriels:
- CaveAVins Tutoriel 1 : L’accès aux données avec Sql Server et EF Code First
- CaveAVins Tutoriel 2 : La publication des données en OData avec WCF Data Services (vous êtes ici )
- CaveAVins Tutoriel 3 : Migration d’une base SQL Server vers SQL Azure
- CaveAVins Tutoriel 4 : Hébergement du service WCF Data Services dans Azure