87 votes

WCF Data Services (OData) Vs ASP.NET Web API

Je suis en train de concevoir une application distribuée qui sera composé de services RESTful et une variété de clients (Silverlight, iOS, Windows Phone 7, etc). Je suis en train de déterminer la technologie à utiliser pour mettre en place mes services, WCF Data Services (OData) ou la nouvelle ASP.NET l'API Web qui vient avec ASP.NET MVC 4.

J'ai regardé un peu les présentations en ligne à propos de chacun et pour l'instant je me suis penché vers les Services de Données WCF principalement en raison de mécanismes de filtrage intégré dans l'URI et natif de l'hypermédia capacité. Le seul inconvénient que je peux voir, c'est le niveau de verbosité de l'Atome Pub spécification contrairement à la VARICELLE.

Est-il quelque chose que je devrais savoir au sujet de ces deux technologies, avant de prendre une décision? Pourquoi quelqu'un de choisir ASP.NET l'API Web sur les Services de Données WCF?

111voto

Devaron Points 851

Il existe d'autres différences majeures entre WebApi et des Services de Données WCF, dont personne ne semble en parler. Je souhaite MS de sortir avec un bon article qui compare les deux.

J'ai suivi OData pour un certain temps et aussi WebApi. J'ai toujours trouvé un peu de distinctions importantes.

Tout d'abord, je ne suis pas sûr de ce que votre patron entend par "MS est la sauvegarde de WebApi", comme pour dire qu'ils ne sont pas la sauvegarde OData?? L'OMI, ils sont la sauvegarde à la fois et actuellement il y a un certain chevauchement. Marché de Données Windows Azure expose leurs Données à l'aide de OData, Azure Table Storage utilise OData, SharePoint 2010 permet OData des Requêtes sur des Données, et d'autres Produits à partir de MS sont également soutien, tels que Excel, PowerPivot. C'est un très puissant Requête cadre quand il s'agit de Données relationnelles. Et parce que c'est Reposant, de toute langue, de cadre, de l'appareil, etc peut s'intégrer à elle.

Voici ce que j'aime à propos de OData + WCF Data Services:

OData + WCF Data Services a finalement permis d'Applications Client à être plus "expressive" lors de l'interrogation des Données sur le Web. Avant, nous avons toujours eu à utiliser ASMX ou WCF pour construire rigide Api Web qui obtiennent difficile et exiger des changements constants à chaque fois qu'une INTERFACE utilisateur veut quelque chose de légèrement différent. L'Application Cliente ne pouvait spécifier les paramètres de dicter ce que les critères de rendement. Ou faire comme moi et de "Sérialiser" Expressions LINQ et passer tous ces Paramètres et ré-hydrater en Expressions<Func<T,bool>> sur le Serveur. Son décent. Fait le travail, mais je veux l'utiliser LINQ sur le Client et les traduire sur le Web à l'aide de REPOS, ce qui est exactement ce que OData permet et je ne veux pas utiliser mon propre "hack" de la solution.

C'est comme l'exposition "TRANSACT SQL", sans la nécessité d'un DB de la Chaîne de Connexion. Simplement fournir une Url et whoala! Commencer à interroger. Bien sûr, les deux WebApi et des Services de Données WCF en charge l'Authentification/Autorisation, de sorte que vous pouvez contrôler l'accès, ajouter des "Où" les états basés sur les rôles ou d'autres données de configuration. Je préfère le faire dans mon Api Web Couche que dans SQL (comme la construction de points de Vue ou Stockées Procs). Et maintenant que les Applications peuvent créer des requêtes elles-mêmes, vous verrez Ad-Hoc et de business intelligence outils de Reporting, commence à mobiliser OData et permettre aux Utilisateurs de définir leurs propres résultats. En ne s'appuyant pas sur des Rapports Statiques où ils ont peu de contrôle.

Lors de l'élaboration de Silverlight, Windows 8 Metro, ou ASP.NET (MVC, WebForms, etc), vous pouvez simplement ajouter un "Service de Référence" dans Visual Studio pour le Service de Données WCF et commencer rapidement à l'aide de LINQ to de Données de requête ET vous obtenez un "Contexte de Données sur le Client, ce qui signifie qu'il enregistre les changements et vous permet de vous "Présenter" vos modifications automatiquement vers le Serveur. Cette très similaire à RIA Services pour Silverlight. Je l'aurais utilisé les Services de Données WCF au lieu de RIA Services, mais à l'époque, il n'a pas de soutien DataAnnotations ou d'Actions, mais maintenant c'est fait :) les Services de Données WCF a un autre avantage sur les RIA Services, qui est la capacité à effectuer des "Projections" de la part du Client. Cela peut aider à la performance, au cas où je ne veux pas retourner toutes les Propriétés d'une Entité. Avoir un "Contexte de Données sur le Client est idéal lorsque vous traitez avec Des Applications métiers.

Ainsi, les Services de Données WCF est idéal si vous avez des Données avec les relations, surtout si vous utilisez SQL Server et Entity Framework. Vous serez rapidement en mesure d'exposer Queryable de Données + Actions (appels d'invoquer des opérations, c'est à dire des flux de travail, les processus d'arrière-plan) sur le REPOS avec très peu de Code. Les Services de Données WCF a été juste mis à jour. Nouvelle version lancée. Découvrez toutes les nouvelles fonctionnalités.

Le revers de la médaille pour les Services de Données WCF est le "contrôle" vous lâche plus de la Pile HTTP. J'ai trouvé le plus gros défaut était dans l' IQueryable<T> Méthodes qui renvoient des Collections. Contrairement à RIA Services ET WebApi, vous N'avez PAS un accès complet à développer la logique de l'IQueryable Méthode. Dans RIA Services et WebApi, vous pouvez écrire le code que vous voulez aussi longtemps que vous revenez IQueryable<T>. Dans les Services de Données WCF, il vous suffit d'accéder à ajouter un "Où" Énoncé à l'aide de Expression<Func<T,bool>> intercepteur Méthodes. J'ai trouvé cela décevant. Actuellement, notre application utilise les Services RIA et je trouve que nous avons vraiment besoin de la capacité à contrôler le IQueryable logique. J'espère que je me trompe sur ce point et je suis juste en manque de quelque chose

Aussi, les Services de Données WCF n'a PAS encore pleinement à tous les Opérateurs LINQ. Il prend toujours en charge de plus de WebApi.

Qu'en est WebApi???

  1. J'aime le contrôle sur Requête/Réponse Http
  2. Il est facile à suivre (effet de levier motifs MVC). Je suis sûr que d'autres l'outillage qui va venir.

Dès maintenant (à ma connaissance), il n'y a pas de "Contexte de Données" soutenir le Client (c'est à dire Silverlight, ASP.NET le Code Côté Serveur, etc), parce que WebApi n'est pas vraiment à propos de Modèles de Données d'Entité, comme les Services de Données WCF/OData est. Il expose des Collections d'Objets de Modèle à l'aide de IQueryable/IEnumerable, mais il n'y a pas de Clé Primaire/Clé Étrangère "Propriétés de Navigation" (par exemple le client.Les factures) à utiliser une fois que les Entités sont chargées sur le Client, car il n'existe pas de Données de Contexte" qui les charge de manière asynchrone (ou dans un appel à l'aide de $expand), et gère les changements. Vous n'avez pas de code généré de la "représentation" de votre Modèle de Données d'Entité sur le Client, comme vous le faites dans RIA Services ou des Services de Données WCF. Je ne dis pas que vous ne pouvez pas/n'ont pas de Modèles dans le Client qui représentent vos Données, mais vous devez remplir manuellement les Données et de gérer les factures sont à régler à chaque "client" une fois qu'ils sont récupérées sur le Web. Cela peut devenir difficile, spécialement avec tous les Async choses qui se passent. Vous ne savez pas qui appelle reviendra première. Ceci peut être difficile à expliquer ici, mais viens de lire sur le "Contexte de Données" choses", RIA Services ou des Services de Données WCF. Quand on parle de la Ligne d'Applications d'Entreprise, c'est un grand problème pour moi. Cela est principalement basée sur la productivité et la facilité de maintenance. Vous pouvez obsolulately de créer des Applications sans un Contexte de Données. Il rend juste les choses plus faciles, spécialement dans Silverlight, WPF, et maintenant Windows 8 Metro. Ayant relationnel Entités chargées dans la mémoire de manière asynchrone et avoir Deux de Liaison est vraiment agréable d'avoir.

Cela dit, est-ce à dire quelques jours WebApi peut prendre en charge un "Contexte de Données sur le Client? Je pense qu'il pourrait. Aussi, avec plus d'outillage, un Projet Visual Studio pourrait générer toutes vos Méthodes CRUD basé sur un Schéma de Base de données (ou Entity Framework).

Aussi, je sais que je suis le seul fait de mentionner .NET pour .NET Cadres quand il s'agit de travailler avec les Services de Données WCF 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é lorsque vous traitez avec une INTERFACE utilisateur Silverlight, ou ASP.NET le Code Côté Serveur, etc. Je crois qu'avec l'avènement de la "IndexedDB" en HTML5/JavaScript, que le fait d'avoir un "Contexte de Données" et une LINQ cadre en JavaScript peuvent également devenus disponibles, ce qui rend la possibilité d'interroger les Services OData encore plus facile à partir de JavaScript (vous pouvez utiliser DataJS aujourd'hui avec OData). De Plus, à l'aide de KnockoutJS à l'appui de MVVM et de Liaison en HTML/JS ainsi, il sera un jeu d'enfant :)

Je suis actuellement à la recherche de la plate-forme à utiliser. Je serais heureuse de l'aide, mais j'ai tendance à pencher vers OData basée sur le fait que ma prochaine Demande est essentiellement à propos de google Analytics (en lecture seule) et je veux un riche expressive Api RESTful. Je crois OData + Services de Données WCF me donne que parce que WebApi ne supporte $prendre$, de sauter, filtre$, $orderby sur les Collections. Il ne prend PAS en charge les Projections, Comprend ($expand), etc. Je n'ai pas beaucoup de "Mises à jour/Suppressions/Inserts" et de nos Données est assez relationnel.

J'espère que d'autres vont se joindre à la discussion et de donner à leurs pensées. Je suis toujours décider et je serais ravi d'entendre d'autres opinions. Je pense vraiment que les deux sont des cadres sont grands. Je me demande si vous avez à choisir, pourquoi ne pas utiliser les deux en cas de besoin. À partir du Client, il est tout au sujet de la construction d'appels de REPOS, de toute façon. Juste une pensée :)

31voto

jrummell Points 23718

C'est une question subjective, voici donc une réponse subjective. OMI, la WCF a beaucoup trop de frais généraux pour les simples services RESTful. Web API, d'autre part, a été conçu spécifiquement pour les services RESTful.

Je suis d'accord avec Dave Ward sur cette. Découvrez son blog pour plus d'informations.

J'ai longtemps tenu le coup contre la pression de passer de ASMX de la WCF dans WebForms projets, car l'acceptation de la WCF complexité principalement m'ont récompensé avec moins de souplesse dans la sérialisation JSON. En revanche, j'ai commencé à convertir certains de mes projets de ASMX à l'API Web, et ont été heureux avec la façon dont facilement l'API Web remplace ASMX.

Je crois que Microsoft a enfin trouvé un bon équilibre entre ASMX est la simplicité et de la WCF pouvoir avec l'API Web.

26voto

resnyanskiy Points 478

Nous croyons que l'API Web fournit la bonne plate-forme pour les services OData aller de l'avant et en tant que telle sera investissant principalement dans cette plate-forme pour OData serveur piles. Nous allons bien sûr continuer à mettre significative des ressources dans l'OData bibliothèques de base et les clients, mais nous n'avons plan à réduire l'investissement dans les Services de Données WCF comme une pile pour la création d'OData services.

OData Blog De L'Équipe

Si, semble maintenant tout est assez clair

16voto

Michael Hays Points 2967

Les deux API Web et des Services de Données WCF en charge OData hors de la boîte. Avec des Services de Données WCF (WCFDS), c'est automatique. Avec l'API Web, de retour IQueryable de votre contrôleur de balise et la méthode avec l' [Queryable]. Ainsi, vous obtenez l' $filter fonctionnalité vous étiez en train de parler. Et si vous allez à ce sujet de cette façon, les deux peuvent manipuler du JSON dans la réponse automatiquement en plaçant accept=application/json dans l'entête de la requête. Le OData de WCFDS prend en charge un peu plus OData mots-clés de l'API Web (bien que seule l' $expand mot vient à l'esprit), mais je suis sûr que le temps permettra de remédier à cela.

Les deux .NET clients et les pages HTML peuvent appeler dans ces deux alternatives facilement, mais si vous aimez LINQ, et vous devez construire .NET clients, WCFDS peuvent être ajoutés à votre projet une référence de service. Cela vous permet de passer l'ensemble de la HTTP entreprise tout à fait et d'interroger directement les collections.

La ligne de fond est que rien ne vous empêche de mettre .svc fichiers dans votre ASP.Net projet MVC. Ce n'est pas une question de choix ou de la proposition. L'ajout de services de données de votre serveur, vous fera économiser le besoin d'écrire beaucoup de contrôleurs, mais ne vous empêche pas d'écrire contrôleurs supplémentaires si vous le souhaitez.

6voto

Soren Points 684

En d'autres termes :

Si vous êtes à la recherche d'exposer un modèle de données (GED ou autre) rapidement et ne nécessitent pas beaucoup de code ou de la logique d'entreprise, WCF Data Services le rend VRAIMENT facile et serait un bon point de départ.

Si vous êtes à la construction d'une API et tout simplement l'envie d'exposer certaines ressources (et logique) à l'aide de OData la syntaxe de la requête ou de la mise en forme, puis ASP.NET l'API Web est probablement le meilleur endroit pour commencer.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X