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?
la source
MediaTypeFormatter
pour formater vos réponses. Voir code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d pour un exemple.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 dans
Expressions<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 revenezIQueryable<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 choseEn 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 ???
À 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 :)
la source
Blog de l'équipe OData
Donc, semble maintenant que tout est assez clair
la source
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
IQueryable
de votre contrôleur et étiquetez la méthode avec[Queryable]
. Cela vous donnera la$filter
fonctionnalité 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/json
en-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.
la source
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
la source
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)
la source
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.
la source
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
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.
la source