WCF Data Services (OData) gegen ASP.NET-Web-API

87

Ich entwerfe eine verteilte Anwendung, die aus RESTful-Diensten und einer Vielzahl von Clients (Silverlight, iOS, Windows Phone 7 usw.) besteht. Im Moment entscheide ich, welche Technologie ich zum Implementieren meiner Dienste, WCF Data Services (OData) oder der neuen ASP.NET-Web-API verwenden soll, die mit ASP.NET MVC 4 herauskommt.

Ich habe einige Online-Präsentationen zu jedem Thema gesehen und neige derzeit zu WCF Data Services, hauptsächlich aufgrund der Filtermechanismen, die in die URI- und native Hypermedia-Funktion integriert sind. Der einzige Nachteil, den ich sehen kann, ist die Ausführlichkeit der Atom Pub-Spezifikation im Gegensatz zu POX.

Gibt es etwas, das ich über diese beiden Technologien wissen sollte, bevor ich eine Entscheidung treffe? Warum sollte sich jemand für die ASP.NET-Web-API gegenüber WCF Data Services entscheiden?

Raymond Saltrelli
quelle

Antworten:

31

Dies ist eine subjektive Frage, daher hier eine subjektive Antwort. IMO, WCF hat viel zu viel Overhead für einfache RESTful-Services. Die Web-API wurde speziell für RESTful-Services entwickelt.

Da stimme ich Dave Ward zu . Weitere Informationen finden Sie in seinem Blog.

Ich habe mich lange gegen den Druck gewehrt, in WebForms-Projekten von ASMX zu WCF zu wechseln, weil mich das Akzeptieren der Komplexität von WCF in erster Linie nur mit einer weniger flexiblen JSON-Serialisierung belohnte. Im Gegensatz dazu habe ich begonnen, einige meiner Projekte von ASMX in Web-API zu konvertieren, und war zufrieden damit, wie einfach Web-API ASMX ersetzt.

Ich glaube, Microsoft hat endlich ein gutes Gleichgewicht zwischen der Einfachheit von ASMX und der Leistung von WCF mit der Web-API gefunden.

jrummell
quelle
2
Danke für die Antwort! Ich habe eine Folgefrage, daher hoffe ich, dass Sie mit der ASP.NET-Web-API ziemlich vertraut sind. Eine Sache, die mir an WCF Data Services gefallen hat, sind die Hypermedia-Funktionen. Anhand des Netflix-Beispiels könnten Sie ein Filmgenre abfragen, und der Dienst würde sofort Links zu jedem Film in diesem Genre anstelle des gesamten Eintrags für jeden Film zurückgeben. Gibt es eine Möglichkeit, dies mit der ASP.NET-Web-API zu tun? Es sieht so aus, als ob Sie die gesamte erweiterte Objektstruktur erhalten, anstatt Hypermedia zu verwenden.
Raymond Saltrelli
Ich hatte noch keine Gelegenheit, es zu verwenden, aber es sieht so aus, als könnten Sie es implementieren, MediaTypeFormatterum Ihre Antworten zu formatieren. Ein Beispiel finden Sie unter code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d .
Jrummell
2
Das ist eine Art Schmerz. Ich hatte gehofft, dass es eine Konfiguration geben würde, um das einzuschalten. Und wenn würde automatisch passieren. Mein Chef drängt auf eine Web-API, weil alle Kräfte, die bei MS vorhanden sind, diese unterstützen. Es scheint alles Wille und gut. Die Nutzdaten sind prägnanter als die von OData. Sie verfügen über die URI-Abfragefunktionen von OData und es fehlen nur sofort einsatzbereite Hypermedien. Vielleicht findet es bis zur Veröffentlichung seinen Weg dorthin.
Raymond Saltrelli
1
Ich denke, diese Antwort sollte erneut überprüft werden, da Microsoft die Verwendung der OData-Web-API über die Web-API betont.
codebased
111

Derzeit gibt es weitere wichtige Unterschiede zwischen WebApi und WCF Data Services, die niemand zu erwähnen scheint. Ich wünschte, MS würde einen guten Artikel herausbringen, in dem die beiden verglichen werden.

Ich verfolge OData seit einer Weile und auch WebApi. Ich habe immer ein paar große Unterschiede gefunden.

Erstens bin ich mir nicht sicher, was Ihr Chef mit "MS unterstützt WebApi" meint, was bedeutet, dass sie OData nicht unterstützen? IMO, sie unterstützen beide und derzeit gibt es einige minimale Überlappungen. Windows Azure Data Market macht seine Daten mithilfe von OData verfügbar, Azure Table Storage verwendet OData, SharePoint 2010 ermöglicht OData-Abfragen über seine Daten und andere Produkte von MS unterstützen dies ebenfalls, z. B. Excel PowerPivot. Es ist ein sehr leistungsfähiges Abfrage-Framework, wenn es um relationale Daten geht. Und weil es RESTful ist, kann jede Sprache, jedes Framework, jedes Gerät usw. in es integriert werden.

Folgendes gefällt mir an OData + WCF Data Services:

OData + WCF Data Services hat es Client-Anwendungen endlich ermöglicht, bei der Abfrage von Daten über das Web "ausdrucksstärker" zu sein. Früher mussten wir immer ASMX oder WCF verwenden, um starre Web-APIs zu erstellen, die unhandlich werden und ständige Änderungen erfordern, wenn eine Benutzeroberfläche etwas anderes wünscht. Die Clientanwendung konnte nur Parameter angeben, um festzulegen, welche Kriterien zurückgegeben werden sollen. Oder machen Sie es wie ich und "serialisieren" Sie LINQ-Ausdrücke und übergeben Sie diese als Parameter und rehydrieren Sie sie erneut Expressions<Func<T,bool>>auf dem Server. Es ist anständig. Ich habe die Arbeit erledigt, möchte aber LINQ auf dem Client verwenden und es mit REST über das Web übersetzen lassen. Genau das erlaubt OData und ich möchte keinen eigenen "Hack" einer Lösung verwenden.

Es ist so, als würde man "TRANSACT SQL" ohne die Notwendigkeit einer DB-Verbindungszeichenfolge verfügbar machen. Geben Sie einfach eine URL und whoala an! Starten Sie die Abfrage. Natürlich unterstützen sowohl WebApi als auch WCF Data Services die Authentifizierung / Autorisierung, sodass Sie den Zugriff steuern und zusätzliche "Where" -Anweisungen basierend auf Rollen oder anderen Datenkonfigurationen anhängen können. Ich mache das lieber in meiner Web-API-Ebene als in SQL (wie beim Erstellen von Ansichten oder gespeicherten Prozessen). Und jetzt, da Anwendungen Abfragen selbst erstellen können, werden Ad-Hoc- und BI-Berichterstellungstools beginnen, OData zu nutzen und Benutzern die Möglichkeit zu geben, ihre eigenen Ergebnisse zu definieren. Sie verlassen sich nicht auf statische Berichte, bei denen sie nur minimale Kontrolle haben.

Bei der Entwicklung in Silverlight, Windows 8 Metro oder ASP.NET (MVC, WebForms usw.) können Sie dem WCF-Datendienst einfach eine "Dienstreferenz" in Visual Studio hinzufügen und schnell mit LINQ Daten abfragen UND erhalten eine "Datenkontext" auf dem Client bedeutet, dass Änderungen nachverfolgt werden und Sie Ihre Änderungen atomar an den Server "senden" können. Dies ist sehr ähnlich zu RIA Services for Silverlight. Ich hätte WCF Data Services anstelle von RIA Services verwendet, aber zu diesem Zeitpunkt wurden keine DataAnnotations oder Actions unterstützt, jetzt jedoch :) WCF Data Services hat einen weiteren Vorteil gegenüber RIA Services, nämlich die Möglichkeit, "Projektionen" durchzuführen. vom Kunden. Dies kann die Leistung verbessern, falls ich nicht alle Eigenschaften einer Entität zurückgeben möchte. Einen "Datenkontext" haben

WCF Data Services eignet sich daher hervorragend, wenn Sie Daten mit Beziehungen haben, insbesondere wenn Sie SQL Server und Entity Framework verwenden. Sie können schnell abfragbare Daten + Aktionen (Aufrufe zum Aufrufen von Vorgängen, dh Workflows, Hintergrundprozesse) über REST mit sehr wenig Code verfügbar machen. WCF Data Services wurde gerade aktualisiert. Neue Version gestartet. Schauen Sie sich alle neuen Funktionen an.

Der Nachteil von WCF Data Services ist die "Kontrolle", die Sie über den HTTP-Stack verlieren. Ich fand den größten Fehler in den IQueryable<T>Methoden, die Sammlungen zurückgeben. Im Gegensatz zu RIA Services UND WebApi haben Sie KEINEN vollständigen Zugriff, um die Logik in der IQueryable-Methode zu entwickeln. In RIA Services und WebApi können Sie jeden gewünschten Code schreiben, solange Sie zurückkehren IQueryable<T>. In WCF Data Services erhalten Sie NUR Zugriff auf das Anhängen einer "Where" -Anweisung mithilfe von Expression<Func<T,bool>>Interceptor-Methoden. Ich fand das enttäuschend. Unsere aktuelle Anwendung verwendet RIA Services und ich finde, wir brauchen wirklich die Fähigkeit, die IQueryable-Logik zu steuern. Ich hoffe ich irre mich und ich vermisse nur etwas

Außerdem unterstützt WCF Data Services noch NICHT alle LINQ-Operatoren vollständig. Es unterstützt jedoch immer noch mehr als WebApi.

Was ist mit WebApi ???

  1. Ich mag die Kontrolle über HTTP-Anfrage / Antwort
  2. Es ist einfach zu befolgen (Nutzung von MVC-Mustern). Ich bin sicher, dass weitere Werkzeuge kommen werden.

Nach meinem Verständnis gibt es derzeit keine Unterstützung für "Datenkontext" auf dem Client (z. B. Silverlight, serverseitiger ASP.NET-Code usw.), da es in WebApi nicht wirklich um Entitätsdatenmodelle wie WCF Data Services / OData geht ist. Es kann Sammlungen von Modellobjekten mit IQueryable / IEnumerable verfügbar machen, es gibt jedoch keine "Navigationseigenschaften" für Primärschlüssel / Fremdschlüssel (dh Kundenrechnungen), die verwendet werden können, sobald die Entitäten auf den Client geladen wurden, da kein "Datenkontext" vorhanden ist. Dadurch werden sie asynchron geladen (oder in einem Aufruf mit $ expand) und die Änderungen verwaltet. Sie haben keine codegenerierte "Darstellung" Ihres Entitätsdatenmodells auf dem Client, wie dies bei RIA Services oder WCF Data Services der Fall ist. Ich sage nicht, dass Sie keine Modelle im Client haben können, die Ihre Daten darstellen. Sie müssen die Daten jedoch manuell ausfüllen und verwalten, welche "Rechnungen" mit jedem "Kunden" festgelegt werden sollen, sobald sie über das Web abgerufen werden. Dies kann schwierig werden, insbesondere bei all den Async-Dingen. Sie wissen nicht, welche Anrufe zuerst zurückkommen. Dies mag hier schwer zu erklären sein, aber lesen Sie einfach über den "Datenkontext" in RIA Services oderWCF-Datendienste . Wenn ich mich also mit Branchen-Apps beschäftige, ist dies für mich ein großes Problem. Dies basiert hauptsächlich auf Produktivität und Wartbarkeit. Sie können Apps ohne Datenkontext veraltet erstellen. Dies erleichtert die Arbeit, insbesondere in Silverlight, WPF und jetzt in Windows 8 Metro. Es ist wirklich schön, relationale Entitäten asynchron in den Speicher zu laden und zwei Bindungen zu haben.

Bedeutet dies jedoch, dass WebApi eines Tages einen "Datenkontext" auf dem Client unterstützen kann? Ich denke es könnte. Mit mehr Tools könnte ein Visual Studio-Projekt auch alle Ihre CRUD-Methoden basierend auf einem Datenbankschema (oder Entity Framework) generieren.

Ich weiß auch, dass ich .NET gegenüber .NET Frameworks nur erwähne, wenn es um die Arbeit mit WCF Data Services oder WebApi geht, aber ich bin mir sehr bewusst, dass HTML / JS auch ein wichtiger Akteur ist. Ich habe nur die Vorteile erwähnt, die ich beim Umgang mit einer Silverlight-Benutzeroberfläche oder einem serverseitigen ASP.NET-Code usw. gefunden habe. Ich glaube, dass mit dem Aufkommen von "IndexedDB" in HTML5 / JavaScript ein "Datenkontext" und ein " Das LINQ-Framework in JavaScript könnte ebenfalls verfügbar werden, wodurch die Abfrage von OData Services über JavaScript noch einfacher wird (Sie können DataJS heute mit OData verwenden). Wenn Sie KnockoutJS verwenden, um MVVM und Binding auch in HTML / JS zu unterstützen, wird dies zu einem Kinderspiel :)

Ich recherchiere derzeit, welche Plattform ich verwenden soll. Ich würde beides gerne verwenden, aber ich neige dazu, mich auf OData zu stützen, da meine nächste Anwendung in erster Linie Analytics (schreibgeschützt) betrifft und ich eine ausdrucksstarke RESTful-API möchte. Ich glaube, OData + WCF Data Services gibt mir das, weil WebApi nur $ take, $ skip, $ filter, $ orderby over Collections unterstützt. Projektionen, Includes ($ expand) usw. werden NICHT unterstützt. Ich habe nicht viele "Updates / Deletes / Inserts" und unsere Daten sind ziemlich relational.

Ich hoffe, dass andere an der Diskussion teilnehmen und ihre Gedanken äußern. Ich entscheide mich immer noch und würde gerne andere Meinungen hören. Ich denke wirklich, dass beide Frameworks großartig sind. Ich frage mich, ob Sie sich überhaupt entscheiden müssen, warum Sie bei Bedarf nicht beide verwenden. Vom Client aus geht es sowieso nur darum, REST-Aufrufe zu erstellen. Nur ein Gedanke :)

Devaron
quelle
4
Web Api hat eine neue Vorschau für die OData-Unterstützung, die fehlende Peacies hinzufügt und sie auf dieselbe Grundlage stellt, die WCF DS verwendet: [link] [ blogs.msdn.com/b/alexj/archive/2012/08/15/…
Johannes Rudolph
@JohannesRudolph - Der von Ihnen angegebene Link klingt interessant, ist aber defekt.
Olly
OK, denke, es ist nur ein Formatierungsproblem. Es sollte sein: blogs.msdn.com/b/alexj/archive/2012/08/15/… .
Olly
Web Api braucht auch nur ein bisschen Liebe, um vor 2013 an Excel-Versionen zu arbeiten: aspnetwebstack.codeplex.com/workitem/820
David d C e Freitas
5
Wie im Jahr 2014 hat Microsoft einen interessanten Blog-Beitrag blogs.msdn.com/b/odatateam/archive/2014/03/27/… , um die Zukunft der OData-Unterstützung von WCF und WebApi zu diskutieren.
Hardywang
26

Wir glauben, dass die Web-API in Zukunft die richtige Plattform für OData-Dienste bietet und daher in erster Linie in diese Plattform für OData-Server-Stacks investieren wird . Wir werden natürlich weiterhin erhebliche Ressourcen in die OData-Kernbibliotheken und -Clients stecken, aber wir planen, die Investitionen in WCF Data Services als Stapel für die Erstellung von OData-Diensten zu reduzieren .

OData Team Blog

So scheint jetzt alles klar genug zu sein

resnyanskiy
quelle
16

Sowohl die Web-API als auch die WCF-Datendienste unterstützen OData sofort. Mit WCF Data Services (WCFDS) erfolgt dies automatisch. Kehren Sie mit der Web-API IQueryablevon Ihrem Controller zurück und kennzeichnen Sie die Methode mit [Queryable]. Dadurch erhalten Sie die $filterFunktionalität, über die Sie gesprochen haben. Wenn Sie dies auf diese Weise tun, können beide JSON in der Antwort automatisch verarbeiten, indem Sie accept=application/jsonden Anforderungsheader eingeben. Die OData von WCFDS unterstützen einige OData-Schlüsselwörter mehr als die Web-API (obwohl nur die$expand Schlüsselwort in den Sinn kommt), aber ich bin sicher, dass die Zeit dies beheben wird.

Sowohl .NET-Clients als auch HTML-Seiten können diese beiden Alternativen problemlos aufrufen. Wenn Sie jedoch LINQ mögen und .NET-Clients erstellen, kann WCFDS als Dienstreferenz zu Ihrem Projekt hinzugefügt werden. Auf diese Weise können Sie das gesamte HTTP-Geschäft überspringen und die Sammlungen direkt abfragen.

Unter dem Strich hindert Sie nichts daran, SVC-Dateien in Ihr ASP.Net MVC-Projekt einzufügen. Es ist kein Entweder-Oder-Vorschlag. Durch das Hinzufügen von Datendiensten zu Ihrem Server müssen Sie nicht viele Controller schreiben, aber Sie können auf Wunsch keine zusätzlichen Controller schreiben.

Michael Hays
quelle
6

Mit anderen Worten :

Wenn Sie ein Datenmodell (EDM oder auf andere Weise) schnell verfügbar machen möchten und nicht viel Code oder Geschäftslogik benötigen, WCF möchten Data Services dies WIRKLICH einfach und wäre ein guter Ausgangspunkt.

Wenn Sie eine API erstellen und einfach einige Ressourcen (und Logik) mithilfe der OData-Abfragesyntax oder der Formatierung verfügbar machen möchten, ist die ASP.NET-Web-API wahrscheinlich der beste Ausgangspunkt.

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

Soren
quelle
5

Devaron gab die informativste Bewertung von WCF vs Web Api, die ich bisher noch nicht gefunden habe. Vielen Dank. Nun, da WCF zu komplex ist, werde ich sagen, dass Komplexität nicht automatisch negativ ist. Sie werden dankbar sein für den Raum, den es Ihnen in Zukunft bietet. Die Herausforderung bei Microsoft-Tools besteht wie immer darin, dass wir diese Zukunft nicht kennen oder kontrollieren. Hoffen wir, dass Microsoft ein einheitlicheres System hat und einige Jahre bestehen bleibt.

Ich muss auch ein großes System bauen, und es betont mich, dass der Weg nicht klarer ist. Ich habe vor, noch ein paar Monate zu warten, während sich das alles erledigt. Und persönlich bin ich auf der Suche nach Daten (siehe auch JayData)

Chris Harrington
quelle
1

Einfach ausgedrückt: Treten Sie vom zugrunde liegenden Protokoll zurück und betrachten Sie dies aus Entwickler- / Benutzerperspektive. Die Web-API ist das erstklassige HTTP-basierte Rest Framework von Microsoft, nicht WCF. Das bedeutet, dass fehlende Rest-Funktionen und Spezifikationen zur Web-API-Pipe und nicht unbedingt zur WCF hinzugefügt werden.

Ja, Sie können diese selbst in WCF implementieren, aber wie im Satz angegeben, müssen Sie diese selbst implementieren.

Nur ein Beispiel: Die Implementierung einer 2-Faktor-Authentifizierung für eine Web-API dauert heute weniger als 15 Minuten mit OWIN, einem primären Authentifizierungs- / Autorisierungs-Nuget-Paket, das als Open Source-Projekt gestartet wurde.

Wenn Sie einen Technologie-Stack verwenden, macht es einen großen Unterschied, den erstklassigen Stack für Microsoft zu verwenden. Sie hätten sogar unzählige MS-Beispielcodes und -Projekte in Github veröffentlicht, die Sie einfach kopieren und in Ihrem eigenen Projekt einen Vorsprung verschaffen können. Es macht auf jeder Ebene einen Unterschied, Dokumentation, Codebeispiele, Funktionsumfang, Support, Hilfs-APIs, die Sie nennen.

Mein einfacher Rat an Sie: Wenn Sie Restfull HTTP-basierte Anwendungen erstellen möchten, verwenden Sie die Web-API (oder ASP.NET Core für Portabilität) und halten Sie sich wirklich von WCF fern. Wenn das Protokoll kein HTTP ist und es wirklich kein HTTP sein kann, verwenden Sie WCF.

Dogu Arslan
quelle
0

Dies ist die TL; DR-Antwort auf diese Frage.

WCF ist das Schweizer Taschenmesser für den Schraubendreher der WEB API für die Datenkommunikation und -übertragung: WCF kann alles, was die WEB API kann, aber wenn Sie mehr benötigen (z. B. mithilfe des TCP-Protokolls), ist WCF der richtige Weg.

Hier ist ein guter Vergleich .

WEB API

Der Hauptgrund für die Verwendung der WEB-API ist das geringe Gewicht. Dies bedeutet, dass es einfacher zu implementieren, leichter zu erlernen, leichter zu warten usw. ist. Es wurde speziell für das Web entwickelt, das RESTful-Webdienste über HTTP benötigt. Es macht das und es macht es gut. Wenn dies alles ist, was Sie brauchen, ist die WEB-API wahrscheinlich der richtige Weg.

Es ist auch Open Source (wenn Sie sich interessieren)

WCF

WCF bietet einfach viel mehr als die WEB-API: Es unterstützt mehrere Übertragungsprotokolle, mehrere Austauschmuster (die WEB-API erfordert die Integration mit SignalR oder Web Sockets), SOAP-Dienste können in WSDL beschrieben werden, verfügen über zusätzliche Sicherheitsfunktionen und vieles mehr. Entscheiden Sie sich für WCF, wenn Sie diese zusätzliche Funktionalität benötigen.

OData

OData ist einfach

Ein offenes Protokoll, mit dem abfragbare und interoperable RESTful-APIs auf einfache und standardmäßige Weise erstellt und verwendet werden können. Quelle: http://www.odata.org/

Mit anderen Worten, auf hoher Ebene wird lediglich eine bestimmte Grammatik für RESTful-HTTP-Anforderungen standardisiert. Welches bietet die gleichen Vorteile wie jedes Protokoll. Ab mindestens 2013 ermöglichen sowohl die WCF- als auch die WEB-API die Verwendung von OData. Es lohnt sich also wahrscheinlich nicht, sich über OData Gedanken zu machen.

Matt
quelle