webentwicklung-frage-antwort-db.com.de

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

Ich entwerfe eine verteilte Anwendung, die aus RESTful-Diensten und einer Vielzahl von Clients besteht (Silverlight, iOS, Windows Phone 7 usw.). Im Moment lege ich fest, welche Technologie ich verwenden sollte, um meine Dienste zu implementieren, WCF Data Services (OData) oder die neue ASP.NET-Web-API, die mit ASP.NET MVC 4 veröffentlicht wird.

Ich habe mir einige Online-Präsentationen über jeden angesehen und neige gerade zu WCF Data Services, hauptsächlich wegen der in die URI und die native Hypermedia-Funktion integrierten Filtermechanismen. Der einzige Nachteil, den ich sehen kann, ist die Ausführlichkeit der Atom Pub-Spezifikation im Gegensatz zu POX.

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

86

Dies ist eine subjektive Frage, also hier eine subjektive Antwort. IMO, WCF hat viel zu viel Aufwand für einfache RESTful-Dienste. Die Web-API hingegen wurde speziell für RESTful-Dienste entwickelt.

Ich bin mit Dave Ward einverstanden . Weitere Informationen finden Sie in seinem Blog.

Ich habe lange gegen den Druck gedrängt, von ASMX zu WCF in .__ zu wechseln. WebForms-Projekte, da die Komplexität von WCF in erster Linie nur akzeptiert wird belohnte mich mit weniger flexibler JSON-Serialisierung. Im Gegensatz dazu habe ich Ich habe mit dem Konvertieren einiger meiner Projekte von ASMX nach Web API begonnen und habe war zufrieden damit, wie einfach das Web-API ASMX ersetzt.

Ich glaube, Microsoft hat endlich eine gute Balance zwischen den ASMX-Werten gefunden Einfachheit und die Leistungsfähigkeit von WCF mit Web-API.

30
jrummell

Derzeit gibt es weitere wichtige Unterschiede zwischen WebApi und WCF Data Services, die anscheinend niemand erwähnt. Ich wünschte, MS würde mit einem guten Artikel herauskommen, der die beiden vergleicht.

Ich verfolge OData seit einiger Zeit 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 unterstützen sie 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 sich jede Sprache, jedes Framework, jedes Gerät usw. in es integrieren.

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

OData + WCF Data Services hat es Client Applications endlich ermöglicht, beim Abfragen von Daten über das Web "ausdrucksvoller" 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 Client-Anwendung 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 hydratisieren Sie sie erneut in Expressions<Func<T,bool>> auf dem Server. Es ist anständig. Ich habe den Job erledigt, möchte aber LINQ auf dem Client verwenden und es mit REST über das Web übersetzen lassen. Dies ist genau das, was OData zulässt, und ich möchte nicht meinen eigenen "Hack" einer Lösung verwenden.

Es ist, als würde man "TRANSACT SQL" ohne DB-Verbindungszeichenfolge verfügbar machen. Geben Sie einfach eine URL und einen whoala an! Beginnen Sie mit der 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 dies lieber in meinem Web-API-Layer als in SQL (wie das Erstellen von Ansichten oder gespeicherten Prozessen). Und jetzt, da Anwendungen selbst Abfragen erstellen können, beginnen Ad-Hoc- und BI-Berichterstellungstools, OData zu nutzen, und ermöglichen es Benutzern, 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 LINQ schnell zum Abfragen von Daten verwenden, UND Sie erhalten eine "Datenkontext" auf dem Client, das heißt, er verfolgt Änderungen und ermöglicht es Ihnen, Ihre Änderungen atomar an den Server zurückzusenden. Dies ist RIA Services for Silverlight sehr ähnlich. Ich hätte WCF-Datendienste anstelle von RIA-Diensten verwendet, aber zu dieser Zeit wurden keine DataAnnotations oder Actions unterstützt, jetzt jedoch :) WCF-Datendienste haben einen weiteren Vorteil gegenüber RIA-Diensten, nämlich die Fähigkeit, "Projektionen" durchzuführen. vom Kunden. Dies kann die Leistung verbessern, falls ich nicht alle Eigenschaften einer Entität zurückgeben möchte. Ein "Datenkontext" auf dem Client ist ideal, wenn Sie mit Branchen-Apps arbeiten.

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

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 Collections zurückgeben. Im Gegensatz zu RIA Services und WebApi haben Sie NICHT den vollen Zugriff, um die Logik in der IQueryable-Methode zu entwickeln. In RIA Services und WebApi können Sie beliebigen Code schreiben, solange Sie IQueryable<T> zurückgeben. In WCF Data Services erhalten Sie NUR Zugriff darauf, eine "Where" -Anweisung mit Expression<Func<T,bool>> Interceptor-Methoden anzufügen. Ich fand das enttäuschend. Unsere aktuelle Anwendung verwendet RIA Services und ich finde, wir müssen wirklich die Möglichkeit haben, die IQueryable-Logik zu steuern. Ich hoffe, ich liege falsch und vermisse einfach etwas

WCF Data Services unterstützt auch noch NICHT alle LINQ-Operatoren. Es unterstützt jedoch immer noch mehr als WebApi.

Was ist mit WebApi ???

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

Soweit ich weiß, 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 Primärschlüssel-/Fremdschlüssel-Navigationseigenschaften (dh customer.Invoices), die verwendet werden können, sobald die Entitäten auf den Client geladen wurden, da kein Datenkontext vorhanden ist. Dieser lädt sie asynchron (oder in einem Aufruf mit $ expand) und verwaltet die Änderungen. Sie haben keine durch Code generierte "Darstellung" Ihres Entitätsdatenmodells auf dem Client, wie Sie dies in RIA Services oder WCF Data Services tun. Ich sage nicht, dass Sie keine Modelle im Client haben können, die Ihre Daten darstellen, aber Sie haben die Daten manuell ausgefüllt und verwaltet, welche "Rechnungen" mit jedem "Kunden" festgelegt werden sollen, sobald sie abgerufen wurden das Netz. Dies kann schwierig werden, besonders wenn all die Async-Sachen laufen. Sie wissen nicht, welche Anrufe zuerst zurückkommen. Dies kann hier schwer zu erklären sein, aber lesen Sie einfach etwas über den "Datenkontext" in RIA Services oder WCF Data Services . Wenn es sich also um Branchen-Apps handelt, ist dies für mich ein großes Problem. Dies basiert hauptsächlich auf Produktivität und Wartbarkeit. Sie können Apps ohne Datenkontext zwangsweise erstellen. Dies vereinfacht die Arbeit, insbesondere in Silverlight, WPF und jetzt Windows 8 Metro. Relationale Entities asynchron in den Speicher zu laden und Two-Binding zu haben, ist wirklich schön.

Bedeutet dies, dass WebApi eines Tages einen "Datenkontext" auf dem Client unterstützen kann? Ich denke es könnte. Mit mehr Werkzeugen kann 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 Player ist. Ich erwähnte nur die Vorteile, die ich beim Umgang mit einer Silverlight-Benutzeroberfläche oder mit serverseitigem ASP.NET-Code usw. gefunden habe. Ich glaube, dass mit dem Aufkommen von "IndexedDB" in HTML5/JavaScript ein "Datenkontext" und ein Möglicherweise wird auch das LINQ-Framework in JavaScript verfügbar, wodurch die Abfrage von OData Services über JavaScript noch einfacher wird (Sie können DataJS heute mit OData verwenden). Wenn Sie außerdem KnockoutJS verwenden, um MVVM und das Binden in HTML/JS zu unterstützen, ist dies ein Kinderspiel :)

Derzeit recherchiere ich, welche Plattform verwendet werden soll. Ich würde beides gerne verwenden, aber ich tendiere dazu, mich zu OData zu neigen, da sich meine nächste Anwendung in erster Linie mit Analytics befasst (schreibgeschützt) und ich eine ausdrucksstarke RESTful-API möchte. Ich glaube, OData + WCF Data Services geben mir das, weil WebApi nur $ take, $ skip, $ filter, $ orderby über Collections unterstützt. Es werden keine Projektionen, Includes ($ expand) usw. unterstützt. Ich habe nicht viele "Updates/Deletes/Inserts" und unsere Daten sind relativ zueinander.

Ich hoffe, dass sich andere an der Diskussion beteiligen und ihre Gedanken äußern. Ich entscheide 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 nicht bei Bedarf beide verwenden. Vom Client aus geht es sowieso nur darum, REST Aufrufe zu erstellen. Nur ein Gedanke :)

110
Devaron

Wir glauben, dass das Web-API die richtige Plattform für OData-Services bietet in der Zukunft und als solche wird hauptsächlich in diese Plattform investieren für OData Server Stacks. Wir werden natürlich weiterhin signifikante Aussagen machen Ressourcen in die OData-Kernbibliotheken und den Client, aber wir planen Verringerung der Investition in WCF Data Services als Stapel zum Erstellen von OData Dienstleistungen.

OData Team Blog

So scheint jetzt alles klar genug zu sein

26
resnyanskiy

Sowohl Web-API als auch WCF Data Services unterstützen OData-Standards. Mit WCF Data Services (WCFDS) erfolgt dies automatisch. Mit der Web-API geben Sie IQueryable von Ihrem Controller zurück und kennzeichnen Sie die Methode mit [Queryable]. Dadurch erhalten Sie die $filter-Funktionalität, über die Sie gesprochen haben. Und wenn Sie es so machen, können beide JSON in der Antwort automatisch behandeln, indem Sie accept=application/json im Anforderungsheader einfügen. Die OData von WCFDS unterstützen ein paar mehr OData-Schlüsselwörter als die Web-API (obwohl nur das Schlüsselwort $expand in den Sinn kommt). 

Sowohl .NET-Clients als auch HTML-Seiten können problemlos in beide Alternativen einbezogen werden. Wenn Sie jedoch LINQ mögen und .NET-Clients erstellen, kann WCFDS als Servicereferenz in Ihr Projekt eingefügt werden. Dadurch können Sie das gesamte HTTP-Geschäft insgesamt überspringen und die Sammlungen direkt abfragen.

Im Endeffekt hindern 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 nicht weitere Controller schreiben, wenn Sie möchten.

16
Michael Hays

Mit anderen Worten :

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

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

http://mattmilner.com/Milner/Blog/post/2013/04/02/WCF-Data-Service-und-Web-API-mit-OData;-choices-choices.aspx

6
Soren

Devaron gab den informativsten Überblick über WCF vs. Web Api, den ich noch nicht gefunden habe. Vielen Dank. Nun zu dem Punkt, dass WCF zu komplex ist, sage ich, dass Komplexität nicht automatisch negativ ist. Sie werden dankbar sein für den Atemraum, den es Ihnen in Zukunft bietet. Die Herausforderung bei Microsoft-Tools ist, dass wir diese Zukunft nicht kennen oder kontrollieren. Hoffen wir, dass Microsoft ein einheitlicheres System erhält und ein paar Jahre bestehen bleibt.

Ich habe auch ein großes System zu bauen, und es betont mich, dass der Weg nicht klarer ist. Ich habe vor, ein paar Monate länger zu warten, während sich das alles beruhigt. Und persönlich verwurzle ich mich für Datajs (siehe auch JayData)

5

Um es einfach auszudrücken, gehen Sie vom zugrunde liegenden Protokoll zurück und betrachten Sie es aus der Perspektive des Entwicklers/Anwenders. Das Web-API ist das erstklassige HTTP-basierte Rest Framework von Microsoft, nicht das WCF. Das bedeutet, dass alle fehlenden Restfunktionen und Spezifikationen zur Web-API-Pipe hinzugefügt werden müssen und nicht unbedingt zu WCF.

Ja, Sie können diese in WCF selbst implementieren, aber wie es in dem Satz heißt, müssen Sie diese selbst implementieren. 

Ein Beispiel: Die Implementierung einer 2-Faktor-Authentifizierung für ein Web-API dauert mit OWIN, einem primären Nuget-Paket für Authentifizierung/Autorisierung, das als Open-Source-Projekt begann, weniger als 15 Minuten. 

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 von MS veröffentlichte Beispielcodes und Projekte in Github veröffentlicht, die Sie einfach kopieren und einen Vorsprung in Ihrem eigenen Projekt schaffen können. Es macht einen Unterschied auf jeder Ebene: Dokumentation, Codebeispiele, Feature-Set, Support, Helfer-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 bleiben Sie wirklich von WCF fern. Wenn das Protokoll nicht HTTP ist und wirklich nicht HTTP sein kann, verwenden Sie WCF. 

1
Dogu Arslan

Dies ist die Antwort auf diese Frage.

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

Hier ist ein großer Vergleich

WEB-API

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

Es ist auch Open Source (wenn Sie sich interessieren)

WCF

WCF bietet weit mehr als nur WEB-API: Es unterstützt mehrere Übertragungsprotokolle, mehrere Austauschmuster (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 . Gehen Sie zu WCF, wenn Sie diese zusätzliche Funktionalität benötigen.

OData

OData ist einfach 

Ein offenes Protokoll, das die Erstellung und Verwendung abfragbarer und interoperabler RESTful-APIs auf einfache und standardmäßige Weise ermöglicht. Quelle: http://www.odata.org/

Mit anderen Worten, auf hoher Ebene standardisiert es lediglich eine bestimmte Grammatik für REST-fähige HTTP-Anforderungen. Das bietet die gleichen Vorteile wie jedes Protokoll. Und seit mindestens 2013 erlauben sowohl die WCF- als auch die WEB-API die Verwendung von OData. Daher ist es wahrscheinlich nicht wert, sich um OData zu sorgen. 

0
Matt