Création d'applications Silverlight (WCF Data Services)
Important
La bibliothèque cliente Services de données WCF 5.0 pour Silverlight n'est pas prise en charge par les applications Windows Phone.Vous devez donc utiliser la bibliothèque cliente OData pour Windows Phone disponible dans le kit de développement logiciel Windows Phone 7.1 SDK.Pour plus d'informations, consultez Présentation OData (Open Data Protocol) pour Windows Phone.Il n'existe actuellement aucune bibliothèque cliente pour Windows Phone prenant en charge OData v3.
La bibliothèque cliente Services de données WCF pour Silverlight génère des requêtes HTTP pour un service de données qui prend en charge la version 3 du protocole OData et convertit les données du flux de réponse OData en objets sur le client. Les deux classes principales de la bibliothèque cliente sont la classe DataServiceContext et la classe DataServiceQuery<TElement>. La classe DataServiceContext encapsule des opérations exécutées sur un service de données spécifié. Les services OData sont sans état. Cependant, le DataServiceContext conserve l'état des entités sur le client entre des interactions avec le service de données. Cela permet au client de prendre en charge des fonctionnalités telles que le suivi des modifications et la gestion des identités. La classe DataServiceQuery<TElement> représente une requête sur un jeu d'entités spécifique. Pour plus d'informations, consultez Utilisation d'un service de données dans une application .NET Framework (WCF Data Services). Pour obtenir un exemple d'une application consommant un flux de l'exemple du service de données Northwind, consultez Démarrage rapide WCF Data Services pour Silverlight.
Notes
Lorsque vous utilisez la bibliothèque cliente Services de données WCF pour Silverlight, toutes les requêtes au service sont effectuées de façon asynchrone.Pour plus d'informations, consultez Opérations asynchrones (WCF Data Services).
Cette rubrique contient les sections suivantes :
Génération de classes de service de données client
Vous pouvez utiliser la boîte de dialogue Ajouter une référence de service dans Visual Studio pour ajouter une référence à un service qui expose un flux OData. Pour plus d'informations, consultez Génération de classes de service de données client (WCF Data Services). Les classes de service de données client peuvent également être générées en utilisant l'outil DataSvcUtil.exe à l'invite de commandes. Pour plus d'informations, consultez Procédure : générer manuellement des classes de service de données client (WCF Data Services).
Notes
Lorsque la version 5.0 d'Services de données WCF est installée, l'outil Ajouter une référence de service ajoute automatiquement une référence à la version Microsoft.Data.Services.Client.SL.dll de la bibliothèque cliente au lieu d'ajouter une référence à la version System.Data.Services.Client.dll incluse dans Silverlight.Si, pour une raison ou pour une autre, vous devez utiliser la précédente version du client Silverlight, vous devez alors ajouter manuellement une référence à la version Silverlight de la bibliothèque cliente.Pour plus d'informations, consultez Procédure : générer manuellement des classes de service de données client (WCF Data Services).
Accessibilité et modification des ressources
Dans une application Silverlight, toutes les opérations exécutées sur un service de données sont asynchrones. Vous pouvez effectuer des opérations asynchrones à l'aide de paires de méthodes sur les classes DataServiceContext et DataServiceQuery<TElement> qui démarrent avec Begin et End respectivement. Les méthodes Begin inscrivent un délégué appelé par le service lorsque l'opération est terminée. Les méthodes End doivent être appelées dans le délégué inscrit pour gérer le rappel des opérations terminées. Lorsque vous appelez la méthode End pour terminer une opération asynchrone, vous devez le faire de la même instance DataServiceQuery<TElement> ou DataServiceContext que celle utilisée pour commencer l'opération. Chaque méthode Begin prend un paramètre state qui peut passer un objet d'état au rappel. Cet objet d'état est récupéré en tant que IAsyncResult fourni avec le rappel et permet d'appeler la méthode End correspondante pour terminer l'opération asynchrone. Par exemple, lorsque vous fournissez l'instance DataServiceQuery<TElement> comme paramètre state lorsque vous appelez la méthode BeginExecute sur l'instance, la même instance DataServiceQuery<TElement> est retournée en tant que IAsyncResult. Puis cette instance de DataServiceQuery<TElement> est utilisée pour appeler la méthode EndExecute pour terminer l'opération de requête. Pour plus d'informations, consultez Opérations asynchrones (WCF Data Services).
Étant donné que la bibliothèque cliente Services de données WCF pour Silverlight accède au service de données de manière asynchrone via des protocoles réseau, vous devez utiliser la méthode BeginInvoke de la classe Dispatcher pour marshaler correctement l'opération de réponse vers le thread d'application principal (thread d'interface utilisateur) de votre application Silverlight. Pour plus d'informations, consultez Synchronizing Data for Multithreading.
Interrogation de ressources
La bibliothèque cliente Services de données WCF pour Silverlight vous permet d'exécuter des requêtes sur un service de données OData à l'aide de modèles de programmation .NET Framework familiers qui incluent l'utilisation de LINQ (Language-Integrated Query). Lorsque la méthode BeginExecute de la DataServiceQuery<TElement> ou du DataServiceContext est appelée, la bibliothèque cliente traduit une requête ou un URI (Uniform Resource Identifier) en un message de requête HTTP GET. La bibliothèque cliente reçoit le message de réponse correspondant et le convertit en instances des classes de service de données client. Ces classes sont suivies par le DataServiceContext auquel la DataServiceQuery<TElement> appartient. Pour plus d'informations, consultez Procédure : exécuter des requêtes asynchrones de service des données (WCF Data Services).
Dans certains cas de figure, il est utile de connaître le nombre total d'entités d'un jeu d'entités et pas simplement le nombre contenu dans le flux et retourné par la requête. Appelez la méthode IncludeTotalCount sur l'instance DataServiceQuery<TElement> pour demander que le nombre total d'entités du jeu soit inclus dans le résultat de la requête. Dans ce cas, la propriété TotalCount du QueryOperationResponse<T> retourné renvoie le nombre total d'entités du jeu. Vous pouvez également utiliser la méthode AddQueryOption pour ajouter l'une des options de requête prises en charge par OData à une requête. Pour plus d'informations, consultez Interrogation du service de données (WCF Data Services).
Requêtes LINQ
Étant donné que la classe DataServiceQuery<TElement> implémente l'interface IQueryable<T> définie par LINQ, la bibliothèque cliente Services de données WCF pour Silverlight est en mesure de transformer des requêtes LINQ sur des données de jeu d'entités en un URI qui représente une expression de requête évaluée par rapport à une ressource du service de données. Par exemple, la requête LINQ suivante retourne un flux représentant une collection d'entités Order filtrées par la valeur de propriété CustomerID fournie par l'utilisateur dans la zone de texte customerId.
' Define a query that returns orders for a give customer.
Dim query = From orderByCustomer In context.Orders _
Where orderByCustomer.Customer.CustomerID = _
Me.customerId.Text _
Select orderByCustomer
// Define a query that returns orders for a give customer.
var query = from orderByCustomer in context.Orders
where orderByCustomer.Customer.CustomerID == this.customerId.Text
select orderByCustomer;
Chargement de contenu différé
Par défaut, Services de données WCF limite la quantité de données retournées par une requête. Toutefois, vous pouvez charger explicitement des données supplémentaires, notamment les entités connexes, les données de réponse paginées et les flux de données binaires, à partir du service de données si nécessaire. Lorsque vous exécutez une requête, seules les entités dans le jeu d'entités traitées sont retournées. Par exemple, lorsqu'une requête exécutée sur le service de données Northwind retourne les entités Customers, par défaut, les entités Orders connexes ne sont pas retournées, même s'il existe une relation entre Customers et Orders. Les entités connexes peuvent être chargées avec la requête d'origine (chargement hâtif) ou par entité (chargement explicite). Pour plus d'informations, consultez Chargement de contenu différé (WCF Data Services). Lorsque vous utilisez le client Silverlight et DataServiceCollection<T>, vous pouvez charger des collections d'entités connexes à partir d'une propriété de navigation en appelant LoadAsync.
Conseil
Au moment de choisir le modèle de chargement des entités connexes, sachez qu'il existe un compromis entre la taille du message et le nombre de requêtes adressées au service de données.
Lorsque la pagination est activée dans le service de données, vous devez charger explicitement les pages de données suivantes à partir du service de données lorsque le nombre d'entrées retournées dépasse la limite de pagination. Étant donné qu'il est impossible de déterminer la pagination à l'avance, nous vous recommandons de configurer l'application cliente Silverlight de sorte à gérer correctement le flux OData paginé. Pour obtenir des exemples de gestion d'une réponse paginée, consultez Procédure : lier des données de service de données aux contrôles (client Silverlight) et Interrogation du service de données (WCF Data Services).
Projection de requête
La projection fournit un mécanisme permettant de réduire la quantité de données du flux OData retournées par une requête en spécifiant que seules certaines propriétés d'une entité doivent être retournées dans la réponse. Pour plus d'informations, consultez OData : option de requête du système Select ($select). Vous pouvez ajouter une clause de projection à une requête LINQ à l'aide de la clause select (Select en Visual Basic). Les données d'entité retournées peuvent être projetées dans des types d'entités ou de non-entités sur le client. Les modifications apportées aux types de non-entités ne peuvent pas être enregistrées dans le service de données. Par exemple, la requête LINQ suivante projette des données Customer dans un nouveau type d'entité CustomerAddress sur le client.
Dim query = From c In context.Customers _
Where c.Country = "Germany" _
Select New CustomerAddress With
{.CustomerID = c.CustomerID, _
.Address = c.Address, _
.City = c.City, _
.PostalCode = c.PostalCode, _
.Country = c.Country _
}
var query = from c in context.Customers
where c.Country == "Germany"
select new CustomerAddress
{
CustomerID = c.CustomerID,
Address = c.Address,
City = c.City,
PostalCode = c.PostalCode,
Country = c.Country
};
Important
Une perte de données peut survenir dans le service de données lorsque vous enregistrez des mises à jour apportées aux types projetés.Pour plus d'informations, consultez Considérations sur la projection dans la documentation client Services de données WCF.
Pour plus d'informations, consultez Procédure : projeter des résultats de requête de service de données (client Silverlight).
Modification des ressources et enregistrement des modifications
Le client suit les modifications apportées aux entités que vous signalez en exécutant manuellement les méthodes suivantes sur DataServiceContext :
Ces méthodes permettent au client de suivre les entités ajoutées et supprimées, ainsi que les modifications que vous apportez aux valeurs de propriété ou aux relations entre les instances d'entités. Lorsque vous utilisez la boîte de dialogue Ajouter une référence de service pour générer les classes de service de données client, une méthode AddTo est également créée pour chaque entité de la classe DataServiceContext générée. Utilisez ces méthodes pour ajouter une instance d'entité à un jeu d'entités et signaler l'ajout au contexte. Ces modifications suivies sont renvoyées au service de données de façon asynchrone lorsque vous appelez les méthodes BeginSaveChanges et EndSaveChanges.
Lorsque vous ajoutez une nouvelle entité à l'aide de la méthode AddObject ou de la méthode AddTo appropriée, les relations entre la nouvelle entité et les entités connexes ne sont pas définies automatiquement. Vous pouvez créer et modifier les relations entre des instances d'entité et faire répercuter par la bibliothèque cliente ces modifications dans le service de données. Les relations entre les entités sont définies comme des associations dans le modèle, et DataServiceContext suit chaque relation comme un objet de lien dans le contexte. Services de données WCF fournit les méthodes suivantes sur la classe DataServiceContext pour créer, modifier et supprimer ces liens :
Pour plus d'informations, consultez Mise à jour du service de données (WCF Data Services).
Utilisation de données binaires
OData définit un mécanisme pour accéder aux données binaires distinctes de l'entité à laquelle elles appartiennent. De cette façon, un service OData peut exposer des volumes de données binaires importants sous forme de ressource multimédia appartenant à une entrée de lien média. Le client Services de données WCF pour Silverlight peut consommer une ressource multimédia à partir d'un service OData sous forme de flux binaire. Pour accéder au flux binaire, appelez la méthode BeginGetReadStream sur l'instance DataServiceContext qui effectue le suivi de l'entité constituant l'entrée de lien média. Cette méthode asynchrone retourne un objet DataServiceStreamResponse lorsque la méthode EndGetReadStream est appelée sur l'instance DataServiceContext retournée par le rappel. De la même manière, une ressource multimédia est envoyée au service OData lorsque vous appelez la méthode SetSaveStream et après que les méthodes BeginSaveChanges et EndSaveChanges ont été appelées. Pour plus d'informations, consultez Procédure : accéder aux données binaires sous forme de flux (client Silverlight).
Liaison de données
Le client Services de données WCF pour Silverlight prend en charge la liaison des données aux contrôles via la classe DataServiceCollection<T>. Cette classe, qui hérite de ObservableCollection<T>, représente une collection de données dynamiques qui fournit des notifications lorsque des éléments sont ajoutés ou supprimés de la collection. Ces notifications permettent au DataServiceContext d'effectuer le suivi automatique des modifications sans que vous ayez besoin d'appeler explicitement les méthodes de suivi des modifications. Une DataServiceCollection<T> est définie en fonction d'une DataServiceQuery<TElement>. Lorsqu'elle est exécutée, cette requête fournit les objets pour la collection.
La méthode LoadAsync est utilisée pour exécuter la requête de façon asynchrone et charger les résultats dans la collection. Cette méthode garantit que les résultats sont marshalés vers le thread approprié, afin d'éviter toute utilisation d'un Dispatcher. Lorsque vous utilisez une instance de DataServiceCollection<T> pour la liaison de données, le client vérifie que les objets suivis par le DataServiceContext restent synchronisés avec les données dans l'élément d'interface utilisateur lié. Il n'est pas nécessaire d'enregistrer manuellement les modifications apportées aux entités d'une collection de liaisons dans le DataServiceContext. Pour plus d'informations, consultez Procédure : lier des données de service de données aux contrôles (client Silverlight).
Exécution inter-domaines
Silverlight vous permet d'accéder aux services hébergés dans un domaine distinct. Ce type d'accès doit être explicitement activé via le déploiement d'un fichier de stratégie inter-domaines sur le serveur. Cette fonctionnalité est incluse dans l'implémentation HTTP du client Silverlight.
Notes
Vous devez prendre connaissance des considérations sur la sécurité avant d'autoriser les clients Silverlight à accéder aux services Web dans une situation inter-domaines.Pour plus d'informations, consultez HTTP Communication and Security with Silverlight.
Pour la plupart des requêtes à un service de données, le client Services de données WCF pour Silverlight utilise une implémentation XMLHTTP. Cependant, lorsque le client Services de données WCF détecte une requête inter-domaines, il utilise automatiquement l'implémentation HTTP du client Silverlight.
Notes
Le client utilise automatiquement l'implémentation HTTP uniquement lorsque la propriété HttpStack est définie sur Auto.
Pour obtenir un exemple de configuration d'un service de données pour autoriser les requêtes inter-domaines à partir d'une application Silverlight, consultez l'article Utilisation du client ADO.NET Data Services Silverlight dans les scénarios inter-domaines et hors navigateur. Silverlight 4 prend désormais en charge l'exécution inter-domaines.
Exécution hors navigateur
Vous pouvez configurer les applications Silverlight de façon à permettre aux utilisateurs de les installer à partir de pages Web hôtes et de les exécuter hors navigateur. Le client Services de données WCF pour Silverlight prend en charge l'exécution hors navigateur. Lorsque le client Services de données WCF détecte une application en cours d'exécution hors navigateur, il utilise automatiquement l'implémentation HTTP du client Silverlight. Il présente donc le même comportement que pour une exécution inter-domaines ; cependant, aucun fichier de stratégie inter-domaines n'est requis. Pour plus d'informations, consultez Out-of-Browser Support.
Authentification de client
Par défaut, le client Services de données WCF pour Silverlight effectue des requêtes au service de données à l'aide des mêmes informations d'identification du client que le navigateur Web. L'authentification est alors gérée par le navigateur Web. Cependant, lorsque l'accès au service de données requiert une requête inter-domaines ou si l'application Silverlight s'exécute hors navigateur, vous pouvez spécifier les informations d'identification fournies lors de la création de la requête. Dans ces cas de figure, le client utilise automatiquement l'implémentation HTTP du client Silverlight pour effectuer les requêtes et les informations d'identification par défaut sont utilisées pour l'authentification. Cependant, lorsque la propriété UseDefaultCredentials est définie sur false, le client utilise les ICredentials attribuées à la propriété Credentials lors de l'authentification auprès du service de données.
Avertissement
Les informations d'identification de l'utilisateur ne doivent être demandées que pendant l'exécution et ne doivent pas être mises en cache.Les informations d'identification doivent toujours être stockées de manière sécurisée.
Vous pouvez également spécifier vos informations d'identification en demandant à ce que l'application utilise l'implémentation HTTP du client Silverlight. Pour ce faire, vous devez définir la valeur de la propriété HttpStack sur ClientHttp. Le code suivant vérifie que les informations d'identification collectées auprès de l'utilisateur au cours de l'exécution sont utilisées lors de l'accès au service de données :
' Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp
context.UseDefaultCredentials = False
context.Credentials = _
New NetworkCredential(userName, password, domain)
// Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp;
context.UseDefaultCredentials = false;
context.Credentials =
new NetworkCredential(userName, password, domain);
Si l'implémentation HTTP du client Silverlight n'est pas utilisée, la définition de la valeur de la propriété UseDefaultCredentials sur false lèvera une exception au cours de l'exécution. Lorsque la valeur des UseDefaultCredentials est true, les informations d'identification par défaut sont utilisées, même si la propriété Credentials est définie.
Avertissement
Les données transmises avec une authentification de base et Digest ne sont pas chiffrées, par conséquent les données sont visibles par tous.De plus, les informations d'authentification de base (nom d'utilisateur et mot de passe) sont envoyées en texte clair et peuvent être interceptées.
Pour plus d'informations, consultez Procédure : spécifier les informations d'identification du client pour une requête de service de données (client Silverlight). Pour obtenir un exemple d'accès à un service de données qui utilise l'authentification par formulaire ASP.NET à partir d'une application Silverlight, consultez l'article Utilisation de la bibliothèque cliente ADO.NET Data Services Silverlight dans les scénarios inter-domaines et hors navigateur – II (Authentification par formulaire).