Opérations et intercepteurs de service (ADO.NET Data Services Framework)
ADO.NET Data Services permet de définir des opérations et/ou intercepteurs de service afin d'étendre le modèle de mappage d'URI aux ressources.
Ajout d'une logique métier à un service de données
Les opérations de service peuvent être utilisées lorsqu'une logique métier est requise, par exemple pour implémenter une logique de validation ou la sécurité. Les opérations de service permettent au développeur de définir une méthode sur le serveur qui, comme toute autre ressource ADO.NET Data Services, est identifiée par un URI. Ces opérations de service sont des méthodes ajoutées à la classe dérivée de DataService qui représente le service de données.
Création d'opérations de service
Pour implémenter une opération de service, définissez une méthode d'instance publique dans le cadre de la classe de service de données dérivée de la classe DataService représentant le service de données.
La méthode doit accepter uniquement les paramètres
[in]
.- Si des paramètres sont définis, le type de chaque paramètre doit être un type primitif.
La méthode doit retourner vide, IEnumerable<T>, IQueryable<T>, T ou une classe primitive telle qu'un entier ou une chaîne.
T DOIT être une classe qui représente un type d'entité dans le modèle de données exposé par le service de données.
Afin de prendre en charge les options de requêtes telles que le tri, la pagination et le filtrage, les méthodes d'opération de service doivent retourner IQueryable<T>.
La méthode doit être annotée avec l'attribut
[WebGet]
ou[WebInvoke]
.[WebGet]
permet d'appeler la méthode à l'aide d'une demande GET.[WebInvoke]
permet d'appeler la méthode à l'aide d'une demande PUT, POST ou DELETE.
Une opération de service peut être annotée avec le SingleResultAttribute, qui spécifie que la valeur de retour de la méthode est une entité unique plutôt qu'une collection d'entités. Cette distinction gouverne la sérialisation résultante de la réponse. Par exemple, lors de l'utilisation de la sérialisation AtomPub, une instance de type de ressource unique est représentée en tant qu'élément d'entrée et un jeu d'instances est représenté en tant qu'élément « feed ».
Si une méthode ne respecte pas les conventions définies ci-dessus, elle ne sera pas exposée en tant qu'opération de service dans le service de données.
Adressage d'opérations de service
Selon la spécification du protocole ADO.NET Data Services, les opérations de service sont adressées en plaçant le nom de la méthode dans le premier segment de chemin d'accès d'un URI. Des segments de chemin d'accès ou des options de requêtes supplémentaires peuvent être ajoutés à l'URI en fonction du type de retour de l'opération de service.
Types de retour valides | Règles d'URI |
---|---|
Void |
Un segment de chemin d'accès unique identique au nom de l'opération de service est autorisé. Les options de requêtes système ne sont pas autorisées. |
IEnumerable<T> |
Un segment de chemin d'accès unique identique au nom de l'opération de service est autorisé. Les options de requêtes système ne sont pas autorisées. |
IQueryable<T> |
Des segments de chemin d'accès d'URI supplémentaires sont autorisés, conformément aux règles de construction de chemin d'accès fournies dans la spécification Spécifications d'ADO.NET Data Service. Les options de requêtes système sont autorisées. |
Ajout d'opérations de service
L'exemple suivant implémente une opération de service sur un service de données exposant un modèle basé sur l'Entity Framework.
public class Northwind :
DataService<NorthwindModel.NorthwindEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
// Entity sets access configuration.
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
// Service operations access configuration.
config.SetServiceOperationAccessRule("OrdersByCity",
ServiceOperationRights.All);
}
[WebGet]
public IQueryable<Orders> OrdersByCity(string city)
{
if (string.IsNullOrEmpty(city))
{
throw new ArgumentNullException("city",
"You must provide a city name argument");
}
return this.CurrentDataSource.Orders.Where(
"it.ShipCity = @city",
new ObjectParameter("city", city));
}
}
Pour invoquer l'opération de service, l'URI suivant est utilisé :
https://server/Northwind.svc/OrdersByCity?city='London'
Le type de retour de l'opération de service étant IQueryable<T>, les segments d'URI supplémentaires sont autorisés. Par exemple, les URI suivants sont valides :
https://server/Northwind.svc/OrdersByCity?city='London'&$top=2
https://server/Northwind.svc/OrdersByCity?city='London'&$top=10&$orderby=OrderID
Contrôle d'accès des opérations de service
La visibilité des opérations de service à l'échelle du service est contrôlée par une méthode sur la classe IDataServiceConfiguration d'une manière qui s'apparente au contrôle de la visibilité des jeux d'entités. Par exemple, pour rendre accessible la méthode CustomersByCity
de l'exemple ci-dessus, le code de la figure suivante est ajouté à la classe dérivée de DataService.
public class Northwind : DataService<NorthwindEntities>
{
public static void InitializeService(
IDataServiceConfiguration config)
{
config.SetServiceOperationAccessRule("CustomersByCity",
ServiceOperationRights.All);
}
[WebGet]
public IQueryable<Customer> CustomersByCity(string city)
{… }
}
Intercepteurs
ADO.NET Data Services permet à un développeur de service de données d'intercepter le canal de demande/réponse et d'injecter une logique de validation personnalisée. Les intercepteurs assument un double rôle dans ADO.NET Data Services ; ils autorisent l'ajout d'une logique de validation au canal de traitement et procurent un emplacement pour l'insertion d'une stratégie d'autorisation personnalisée sur la base de chaque demande.
Remarque |
---|
Les intercepteurs de requêtes ne peuvent pas prendre de paramètre. |
Traitement d'URI/demande
Lorsqu'une demande GET est reçue par un service de données, l'URI de demande est traitée et toute méthode d'interception de requête définie sur le service de données est appelée. L'exemple suivant illustre l'implémentation d'une méthode d'interception de requête qui intercepte la demande GET concernant des commandes. Cet intercepteur retourne uniquement les commandes affectées au client pour lequel CustomerID=="AROUT"
. Du code supplémentaire serait nécessaire pour authentifier l'utilisateur envoyant la demande, de sorte que cette méthode retourne uniquement les commandes affectées à chaque utilisateur.
[QueryInterceptor("Orders")]
public Expression<Func<Orders, bool>> FilterOrdersByCustomer()
{
return o => o.Customers.CustomerID == "AROUT";
}
Voir aussi
Concepts
Extensions aux services de données (ADO.NET Data Services Framework)
Format d'URI pour l'adressage des ressources (ADO.NET Data Services Framework)