Services de données WCF (OData) contre API Web ASP.NET

87

Je conçois une application distribuée qui se composera de services RESTful et d'une variété de clients (Silverlight, iOS, Windows Phone 7, etc.). À l'heure actuelle, je détermine quelle technologie je dois utiliser pour implémenter mes services, WCF Data Services (OData) ou la nouvelle API Web ASP.NET qui sortira avec ASP.NET MVC 4.

J'ai regardé quelques présentations en ligne sur chacun d'eux et en ce moment je me penche vers les services de données WCF principalement en raison des mécanismes de filtrage intégrés à l'URI et à la capacité hypermédia native. Le seul inconvénient que je peux voir est la verbosité de la spécification Atom Pub par opposition à POX.

Y a-t-il quelque chose que je devrais savoir sur ces deux technologies avant de prendre une décision? Pourquoi quelqu'un choisirait l'API Web ASP.NET plutôt que les services de données WCF?

Raymond Saltrelli
la source

Réponses:

31

C'est une question subjective, voici donc une réponse subjective. OMI, WCF a beaucoup trop de frais généraux pour de simples services RESTful. L'API Web, en revanche, a été conçue spécifiquement pour les services RESTful.

Je suis d'accord avec Dave Ward à ce sujet . Consultez son blog pour plus d'informations.

J'ai longtemps résisté à la pression de passer d'ASMX à WCF dans les projets WebForms, car accepter la complexité de WCF ne m'a principalement récompensé que par une sérialisation JSON moins flexible. En revanche, j'ai commencé à convertir certains de mes projets d'ASMX en API Web et j'ai été satisfait de la facilité avec laquelle l'API Web remplace ASMX.

Je pense que Microsoft a enfin trouvé un bon équilibre entre la simplicité d'ASMX et la puissance de WCF avec l'API Web.

jrummell
la source
2
Merci d'avoir répondu! J'ai une question de suivi, donc j'espère que vous êtes assez familier avec l'API Web ASP.NET. Une chose que j'ai aimée à propos des services de données WCF, ce sont les capacités hypermédia. En utilisant leur exemple Netflix, vous pouvez interroger un genre de films et, hors de la boîte, le service renverrait des liens vers chaque film de ce genre au lieu de l'entrée entière pour chaque film. Existe-t-il un moyen de le faire avec l'API Web ASP.NET? Il semble que cela vous donne toute la structure d'objet développée au lieu d'utiliser l'hypermédia.
Raymond Saltrelli
Je n'ai pas encore eu l'occasion de l'utiliser, mais il semble que vous puissiez l'implémenter MediaTypeFormatterpour formater vos réponses. Voir code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d pour un exemple.
jrummell
2
C'est un peu pénible. J'espérais qu'il y aurait une sorte de configuration pour activer cela. Et si cela se produirait automatiquement. Mon patron fait pression pour l'API Web parce que tous les pouvoirs en place chez MS la soutiennent. Tout cela semble bon et volontaire. Sa charge utile est plus concise que OData, elle a les capacités d'interrogation URI d'OData, il manque juste un hypermédia prêt à l'emploi. Peut-être qu'il trouvera son chemin là-dedans d'ici la sortie.
Raymond Saltrelli
1
Je pense que cette réponse devrait être réexaminée car Microsoft insiste sur l'utilisation de l'API Web OData sur l'API Web.
basé sur le code le
111

Il existe actuellement d'autres différences majeures entre WebApi et WCF Data Services, que personne ne semble jamais mentionner. J'aimerais que MS publie un bon article comparant les deux.

Je suis OData depuis un moment et aussi WebApi. J'ai toujours trouvé quelques distinctions majeures.

Premièrement, je ne suis pas sûr de ce que votre patron entend par "MS soutient WebApi", car cela signifie qu'ils ne soutiennent pas OData ?? OMI, ils soutiennent les deux et actuellement il y a un chevauchement minimal. Windows Azure Data Market expose ses données à l'aide d'OData, Azure Table Storage utilise OData, SharePoint 2010 autorise les requêtes OData sur ses données et d'autres produits de MS le prennent également en charge, tels qu'Excel PowerPivot. C'est un cadre de requête très puissant en matière de données relationnelles. Et comme il est RESTful, n'importe quel langage, framework, appareil, etc. peut s'y intégrer.

Voici ce que j'aime à propos des services de données OData + WCF:

OData + WCF Data Services a finalement permis aux applications client d'être plus "expressives" lors de l'interrogation de données sur le Web. Auparavant, nous devions toujours utiliser ASMX ou WCF pour créer des API Web rigides qui sont peu maniables et nécessitent des changements constants chaque fois qu'une interface utilisateur veut quelque chose de légèrement différent. L'application cliente pouvait uniquement spécifier des paramètres pour dicter les critères à renvoyer. Ou faites comme je l'ai fait et «Sérialisez» les expressions LINQ et passez-les en tant que paramètres et réhydratez-vous dansExpressions<Func<T,bool>> sur le serveur. C'est décent. J'ai fait le travail, mais je veux utiliser LINQ sur le client et le faire traduire sur le Web en utilisant REST, ce qui est exactement ce que permet OData et je ne veux pas utiliser mon propre "hack" d'une solution.

C'est comme exposer "TRANSACT SQL" sans avoir besoin d'une chaîne de connexion DB. Fournissez simplement une URL et whoala! Commencez à interroger. Bien sûr, WebApi et WCF Data Services prennent en charge l'authentification / autorisation, vous pouvez donc contrôler l'accès, ajouter des instructions "Where" supplémentaires basées sur les rôles ou toute autre configuration de données. Je préfère le faire dans ma couche API Web que dans SQL (comme la construction de vues ou de processus stockés). Et maintenant que les applications peuvent créer elles-mêmes des requêtes, vous verrez des outils de création de rapports ad hoc et BI commencer à exploiter OData et permettre aux utilisateurs de définir leurs propres résultats. Ne pas se fier aux rapports statiques où ils ont un contrôle minimal.

Lors du développement dans Silverlight, Windows 8 Metro ou ASP.NET (MVC, WebForms, etc.), vous pouvez simplement ajouter une «référence de service» dans Visual Studio au service de données WCF et commencer rapidement à utiliser LINQ pour interroger des données ET vous obtenez un «Contexte de données» sur le client, ce qui signifie qu'il suit les modifications et vous permet de «soumettre» vos modifications de manière atomique au serveur. Ceci est très similaire aux services RIA pour Silverlight. J'aurais utilisé les services de données WCF au lieu des services RIA, mais à l'époque, ils ne prenaient pas en charge les annotations de données ou les actions, mais maintenant c'est le cas :) Les services de données WCF ont un autre avantage par rapport aux services RIA, qui est la possibilité d'effectuer des «projections» du client. Cela peut améliorer les performances, au cas où je ne souhaite pas renvoyer toutes les propriétés d'une entité. Avoir un "contexte de données"

Ainsi, WCF Data Services est idéal si vous avez des données avec des relations, en particulier si vous utilisez SQL Server et Entity Framework. Vous serez rapidement en mesure d'exposer des données interrogeables + actions (appels pour appeler des opérations, c'est-à-dire des flux de travail, des processus d'arrière-plan) sur REST avec très peu de code. WCF Data Services vient d'être mis à jour. Nouvelle version lancée. Découvrez toutes les nouvelles fonctionnalités.

L'inconvénient des services de données WCF est le «contrôle» que vous perdez sur la pile HTTP. J'ai trouvé que le plus gros défaut était dans les IQueryable<T>méthodes qui retournent les collections. Contrairement aux services RIA ET WebApi, vous N'AVEZ PAS un accès complet pour développer la logique de la méthode IQueryable. Dans les services RIA et WebApi, vous pouvez écrire le code de votre choix tant que vous revenez IQueryable<T>. Dans WCF Data Services, vous avez UNIQUEMENT accès pour ajouter une instruction «Where» à l'aide deExpression<Func<T,bool>> méthodes d'intercepteur. J'ai trouvé cela décevant. Notre application actuelle utilise les services RIA et je trouve que nous avons vraiment besoin de la capacité de contrôler la logique IQueryable. J'espère que je me trompe et qu'il me manque juste quelque chose

En outre, WCF Data Services ne prend pas encore totalement en charge tous les opérateurs LINQ. Cependant, il prend toujours en charge plus que WebApi.

Et WebApi ???

  1. J'aime le contrôle sur Http Request / Response
  2. C'est facile à suivre (en tirant parti des modèles MVC). Je suis sûr que d'autres outils viendront.

À partir de maintenant (à ma connaissance), il n'y a pas de prise en charge du «contexte de données» sur le client (c'est-à-dire Silverlight, code côté serveur ASP.NET, etc.), car WebApi ne concerne pas vraiment les modèles de données d'entité comme les services de données WCF / OData est. Il peut exposer des collections d'objets de modèle à l'aide de IQueryable / IEnumerable, mais il n'y a pas de «propriétés de navigation» de clé primaire / clé étrangère (c'est-à-dire customer.Invoices) à utiliser une fois que les entités sont chargées sur le client, car il n'y a pas de «contexte de données» qui les charge de manière asynchrone (ou en un seul appel en utilisant $ expand), et gère les changements. Vous n'avez aucune "représentation" générée par code de votre modèle de données d'entité sur le client, comme vous le faites dans les services RIA ou les services de données WCF. Je ne dis pas que vous ne pouvez pas / n'avez pas de modèles dans le client qui représentent vos données, mais vous devez remplir manuellement les données et gérer les «factures» à définir avec chaque «client» une fois qu'elles sont récupérées sur le Web. Cela peut devenir délicat, surtout avec toutes les choses Async. Vous ne savez pas quels appels reviendront en premier. Cela peut être difficile à expliquer ici, mais lisez simplement les informations sur le "Contexte des données" dans les services RIA ouServices de données WCF . Donc, lorsque vous traitez avec les applications métier, c'est un problème majeur pour moi. Ceci est principalement basé sur la productivité et la maintenabilité. Vous pouvez créer des applications de manière obsolète sans contexte de données. Cela facilite simplement les choses, en particulier dans Silverlight, WPF et maintenant Windows 8 Metro. Avoir des entités relationnelles chargées en mémoire de façon asynchrone et avoir deux liaisons est vraiment agréable à avoir.

Cela dit, cela signifie-t-il qu'un jour WebApi peut prendre en charge un «contexte de données» sur le client? Je pense que c'est possible. De plus, avec plus d'outils, un projet Visual Studio pourrait générer toutes vos méthodes CRUD basées sur un schéma de base de données (ou Entity Framework).

De plus, je sais que je ne mentionne .NET à .NET Frameworks que lorsqu'il s'agit de travailler avec WCF Data Services ou WebApi, mais je suis très conscient que HTML / JS est également un acteur majeur. Je viens de mentionner les avantages que j'ai trouvés en traitant avec une interface utilisateur Silverlight, ou un code côté serveur ASP.NET, etc. Je crois qu'avec l'avènement de «IndexedDB» en HTML5 / JavaScript, avoir un Le framework LINQ en JavaScript pourrait également devenir disponible, rendant la possibilité d'interroger les services OData encore plus facilement à partir de JavaScript (vous pouvez utiliser DataJS aujourd'hui avec OData). De plus, l'utilisation de KnockoutJS pour prendre en charge MVVM et la liaison en HTML / JS en fera un jeu d'enfant :)

Je recherche actuellement la plateforme à utiliser. Je serais heureux d'utiliser l'un ou l'autre, mais j'ai tendance à me pencher vers OData sur la base du fait que ma prochaine application concerne principalement Analytics (lecture seule) et que je veux une API RESTful expressive riche. Je crois que les services de données OData + WCF me le donnent parce que WebApi ne prend en charge que $ take, $ skip, $ filter, $ orderby sur les collections. Il ne prend PAS en charge les projections, comprend ($ expand), etc. Je n'ai pas beaucoup de "mises à jour / suppressions / insertions" et nos données sont assez relationnelles.

J'espère que d'autres se joindront à la discussion et donneront leur avis. Je suis toujours en train de décider et j'aimerais entendre d'autres opinions. Je pense vraiment que les deux cadres sont excellents. Je me demande si vous devez même choisir, pourquoi ne pas utiliser les deux si nécessaire. À partir du client, tout est question de créer des appels REST de toute façon. Juste une pensée :)

Devaron
la source
4
Web Api a un nouvel aperçu pour la prise en charge d'OData qui ajoute les éléments manquants et le met sur les mêmes bases que WCF DS utilise: [link] [ blogs.msdn.com/b/alexj/archive/2012/08/15/…
Johannes Rudolph
@JohannesRudolph - Le lien que vous avez donné semble intéressant mais il est rompu.
Olly
OK, je pense que c'est juste un problème de formatage. Ce devrait être: blogs.msdn.com/b/alexj/archive/2012/08/15/… .
Olly
Web Api a également juste besoin de ce petit peu d'amour pour travailler sur les versions d'Excel antérieures à 2013: aspnetwebstack.codeplex.com/workitem/820
David d C e Freitas
5
Comme nous sommes en 2014 maintenant, Microsoft a un article de blog intéressant blogs.msdn.com/b/odatateam/archive/2014/03/27/… pour discuter de l'avenir du support OData de WCF et WebApi.
hardywang
26

Nous pensons que l'API Web fournit la bonne plate-forme pour les services OData à l'avenir et, à ce titre, investira principalement dans cette plate-forme pour les piles de serveurs OData. Nous continuerons bien sûr à mettre des ressources importantes dans les bibliothèques principales et le client OData, mais nous prévoyons de réduire les investissements dans les services de données WCF en tant que pile pour créer des services OData.

Blog de l'équipe OData

Donc, semble maintenant que tout est assez clair

resnyanskiy
la source
16

L'API Web et les services de données WCF prennent en charge OData par défaut. Avec WCF Data Services (WCFDS), c'est automatique. Avec l'API Web, revenez IQueryablede votre contrôleur et étiquetez la méthode avec [Queryable]. Cela vous donnera la $filterfonctionnalité dont vous parliez. Et si vous procédez de cette façon, les deux peuvent gérer automatiquement JSON dans la réponse en insérant l' accept=application/jsonen-tête de la requête. L'OData de WCFDS prend en charge quelques mots clés OData de plus que l'API Web (bien que seul le$expand mot clé me ​​vienne à l'esprit), mais je suis sûr que le temps y remédiera.

Les clients .NET et les pages HTML peuvent faire appel à ces deux alternatives facilement, mais si vous aimez LINQ et que vous créez des clients .NET, WCFDS peut être ajouté à votre projet en tant que référence de service. Cela vous permet d'ignorer toutes les activités HTTP et d'interroger directement les collections.

L'essentiel est que rien ne vous empêche de placer des fichiers .svc dans votre projet ASP.Net MVC. Ce n'est pas une proposition ni l'un ni l'autre. L'ajout de services de données à votre serveur vous évitera d'avoir à écrire de nombreux contrôleurs, mais ne vous empêchera pas d'écrire des contrôleurs supplémentaires si vous le souhaitez.

Michael Hays
la source
6

En d'autres termes :

Si vous cherchez à exposer rapidement un modèle de données (EDM ou autre) et que vous n'avez pas besoin de beaucoup de code ou de logique métier, WCF Data Services rend cela VRAIMENT facile et serait un bon point de départ.

Si vous créez une API et souhaitez simplement exposer certaines ressources (et la logique) à l'aide de la syntaxe de requête OData ou de la mise en forme, l' API Web ASP.NET est probablement le meilleur point de départ.

http://mattmilner.com/Milner/Blog/post/2013/04/02/WCF-Data-Services-and-Web-API-with-OData;-choices-choices.aspx

Soren
la source
5

Devaron a donné l'examen le plus instructif de WCF vs Web Api que je n'ai pas encore trouvé. Merci. Maintenant que WCF est trop complexe, je dirai que la complexité n'est pas automatiquement un négatif. Vous serez reconnaissant pour la marge de manœuvre qu'il vous offrira à l'avenir. Le défi, comme toujours avec les outils Microsoft, est que nous ne connaissons ni ne contrôlons cet avenir. Espérons que Microsoft se retrouvera avec un système plus unifié, et qu'il restera quelques années.

J'ai aussi un gros système à construire, et cela me souligne que le chemin n'est pas plus clair. J'ai l'intention d'attendre encore quelques mois pendant que tout s'arrangera. Et personnellement, je suis enraciné pour datajs (consultez également JayData)

Chris Harrington
la source
1

Pour le dire simplement de cette façon, prenez du recul par rapport au protocole sous-jacent et regardez cela du point de vue du développeur / utilisateur. L'API Web est le cadre de repos basé sur HTTP de Microsoft, et non WCF. Cela signifie que toutes les fonctionnalités et spécifications de Rest manquantes seront ajoutées au canal API Web et pas nécessairement à WCF.

Oui, vous pouvez les implémenter vous-même dans WCF, mais comme indiqué dans la phrase, vous devez les implémenter vous-même.

À titre d'exemple aujourd'hui, la mise en œuvre d'une authentification à 2 facteurs pour une API Web prend moins de 15 minutes en utilisant OWIN qui est un package de nuget principalement d'authentification / autorisation qui a commencé comme un projet open source.

Lorsque vous utilisez une pile technologique, l'utilisation de la pile de première classe pour Microsoft fait une énorme différence. Vous auriez même d'innombrables exemples de code et de projets publiés par MS dans Github que vous pouvez simplement copier et prendre une longueur d'avance dans votre propre projet. Cela fait une différence à tous les niveaux, documentation, exemples de code, ensemble de fonctionnalités, support, api d'assistance que vous nommez.

Donc, mon simple conseil à vous, si vous souhaitez créer des applications basées sur HTTP Restfull, utilisez l'API Web (ou ASP.NET Core pour la portabilité) et restez vraiment à l'écart de WCF. Si le protocole n'est pas HTTP et qu'il ne peut vraiment pas être HTTP, utilisez WCF.

Dogu Arslan
la source
0

Voici la réponse TL; DR à cette question.

WCF est le couteau suisse du tournevis de l'API WEB pour la communication et le transfert de données: WCF peut faire tout ce que l'API WEB peut faire, mais si vous avez besoin de plus (par exemple, en utilisant le protocole TCP), WCF est la voie à suivre.

Voici une excellente comparaison .

API WEB

La première raison d'utiliser l'API WEB est qu'elle est légère. Cela signifie qu'il est plus simple à implémenter, plus facile à apprendre, plus facile à maintenir, etc. Il est spécifiquement conçu pour le Web, qui a besoin de services Web RESTful sur HTTP. Il fait cela et il le fait bien. Si c'est tout ce dont vous avez besoin, l'API WEB est probablement la voie à suivre.

De plus, c'est Open Source (si vous vous en souciez)

WCF

WCF fait bien plus que l'API WEB: il prend en charge plusieurs protocoles de transfert, plusieurs modèles d'échange (l'API WEB nécessite une intégration avec SignalR ou Web Sockets), les services SOAP peuvent être décrits dans WSDL, dispose de fonctionnalités de sécurité supplémentaires, etc. Optez pour WCF si vous avez besoin de cette fonctionnalité supplémentaire.

OData

OData est simplement

Un protocole ouvert pour permettre la création et la consommation d'API RESTful interrogeables et interopérables d'une manière simple et standard. source: http://www.odata.org/

En d'autres termes, de haut niveau, il s'agit simplement de standardiser une grammaire spécifique pour les requêtes HTTP RESTful. Ce qui offrira les mêmes avantages que n'importe quel protocole. Et depuis au moins 2013, les API WCF et WEB autorisent l'utilisation d'OData. Donc, cela ne vaut probablement pas la peine de s'inquiéter pour OData.

Mat
la source