Wie verwalte ich die technische Debatte über WCF vs. Web API?


49

Ich leite derzeit ein Team von etwa 15 Entwicklern und wir stecken an einem Punkt der Auswahl der Technologie fest, an dem das Team in zwei völlig entgegengesetzte Teams aufgeteilt ist und über die Verwendung von WCF vs. Web API debattiert.

Team A, das die Verwendung der Web-API unterstützt, führt folgende Gründe an:

  1. Web-API ist nur die moderne Art, Dienste zu schreiben ( Wikipedia )
  2. WCF ist ein Overhead für HTTP. Es ist eine Lösung für TCP, Net Pipes und andere Protokolle
  3. WCF-Modelle sind aufgrund von [DataContract] & [DataMember] und diesen Attributen nicht POCO
  4. SOAP ist nicht so lesbar und handlich wie JSON
  5. SOAP ist ein Overhead für das Netzwerk im Vergleich zu JSON (Transport über HTTP)
  6. Keine Methodenüberladung

Team B, das die Verwendung von WCF unterstützt, sagt:

  1. WCF unterstützt mehrere Protokolle (über Konfiguration)
  2. WCF unterstützt verteilte Transaktionen
  3. Es gibt viele gute Beispiele und Erfolgsgeschichten für WCF (während die Web-API noch jung ist)
  4. Duplex eignet sich hervorragend für die bidirektionale Kommunikation

Diese Debatte geht weiter und ich weiß nicht, was ich jetzt tun soll. Persönlich denke ich, dass wir ein Tool nur für den richtigen Einsatzort verwenden sollten . Mit anderen Worten, wir sollten besser die Web-API verwenden, wenn wir einen Dienst über HTTP verfügbar machen möchten, aber wenn es um TCP und Duplex geht, sollten wir WCF verwenden.

Wenn wir im Internet suchen, können wir kein solides Ergebnis erzielen. Es gibt viele Stellen für die Unterstützung von WCF, aber im Gegenteil, wir finden auch Leute, die sich darüber beschweren. Ich weiß, dass die Art dieser Frage vielleicht fraglich klingt, aber wir brauchen einige gute Hinweise, um uns zu entscheiden. Wir stecken an einem Punkt fest, an dem wir es möglicherweise später bereuen, wenn wir uns zufällig für eine Technologie entscheiden . Wir wollen mit offenen Augen wählen.

Unsere Nutzung würde hauptsächlich für das Web erfolgen, und wir würden unsere Dienste über HTTP verfügbar machen. In einigen Fällen (etwa 5 bis 10 Prozent) benötigen wir jedoch möglicherweise verteilte Transaktionen.

Was sollte ich jetzt tun? Wie gehe ich konstruktiv mit dieser Debatte um?


11
Vergessen Sie nicht, dass Web-API es Verbrauchern nicht einfach macht, einen Service-Client wie eine SOAP-WSDL zu generieren. Wenn Sie nur .NET-Clients haben, ist dies keine große Sache, da diese die von Ihnen implementierten Vertragsobjekte gemeinsam nutzen können. Clients in anderen Sprachen müssen ihre Clientobjekte jedoch manuell erstellen, wenn Sie SOAP nicht verwenden.
Jimmy Hoffa

10
Denken Sie auch daran, dass WCF in den meisten Fällen auch recht anständig json kann
Bill

3
"3. WCF-Modelle sind nicht POCO" , das ist einfach falsch. Sie müssen seit .NET 3.5 SP1 keine Attribute mehr verwenden.
Allon Guralnek

4
Diese Frage scheint nicht zum Thema zu gehören, da es darum geht, eine Debatte unter Mitarbeitern zu führen, nicht um Softwareentwicklung.
GroßmeisterB

3
Wikipedia definiert "die moderne Art, Dienste zu schreiben"? Ich bin mir nicht sicher, wie nützlich das ist.
Frank Hileman

Antworten:


38

Wenn beide Seiten gute Argumente haben und die Meinungen zu diesem Thema zu stark sind, um zu einem Konsens zu gelangen, müssen Sie als Manager eine Entscheidung treffen und die Debatte beenden. Andernfalls dreht es sich nur im Kreis und stärkt die Positionen aller Teilnehmer noch mehr. Je länger Sie warten, desto schwieriger wird es für die "Verliererseite", sich geschlagen zu geben und produktiv mit dem Ergebnis zu arbeiten.

Notieren Sie sich alle Argumente, bewerten Sie deren Bedeutung für das Projekt und treffen Sie dann Ihre Entscheidung. Wenn Sie nicht können, werfen Sie eine Münze. Ihr Projekt kann wahrscheinlich mit beiden Technologien erfolgreich abgeschlossen werden, und die Verschwendung wertvoller Zeit mit unnötigen Debatten kostet nur unnötiges Geld.


3
Lieber @Philipp, danke für die Flip die Münze Vorschlag. Aber wie gesagt, ich möchte diese zufällige Entscheidung nicht bereuen . Während ich glaube, dass Beweglichkeit wichtig ist, glaube ich auch, dass gute Entscheidungen wichtig sind.
Saeed Neamati

5
@ SaeedNeamati: Wenn nach dem Sammeln und Abwägen aller Informationen keine Technologie einen klaren Vorteil hat, ist das Werfen einer Münze die ehrlichste Art, sich zu entscheiden. Unabhängig vom Ergebnis des Wurfs ist dies eine gute Entscheidung, da Sie alle Informationen abgewogen haben.
Bart van Ingen Schenau

9
@ SaeedNeamati: Ich bin völlig einverstanden mit "eine Münze werfen". Im Moment befinden Sie sich in einer klaren Analyse-Lähmung (Ihre genauen Wörter befinden sich auf dieser Wiki-Seite), die IMO gefährlicher ist, als eine Entscheidung zu treffen, die möglicherweise nicht "die beste" ist. Wenn Sie sich so schwer entscheiden, bedeutet das, dass auch die andere, weniger optimale Entscheidung nicht so schlecht ist. Und solange Sie Ihre Software modular erstellen, sollten Sie in der Lage sein, genügend Abstraktion zu lassen, um eine Technologie herauszunehmen und die andere bei Bedarf einzusetzen, was in beiden Fällen sehr unwahrscheinlich ist.
DXM

2
@SaeedNeamati Was die Technologie angeht, gibt es keine Möglichkeit, diese Entscheidung zu "bereuen". Sie werden immer Fehler machen. Wichtiger ist es, Fehler so schnell wie möglich zu erkennen, offen zuzugeben und Entscheidungen zum Besseren zu ändern.
Sleeper Smith

4
Andere Optionen: Knöchelkampf; Wrestling Kampf; Wer am lautesten schreit, gewinnt. Das ist doch besser, als eine Münze zu werfen? :)
Frank Hileman

13

Angenommen, beide Seiten haben in all ihren Argumenten 100% Recht. Welche sind von Bedeutung?

WCF-Modelle sind aufgrund von [DataContract] & [DataMember] und diesen Attributen nicht POCO

Kümmert es dich? Planen Sie etwas zu tun, das POCO erfordert?

WCF unterstützt verteilte Transaktionen

Wieder ist dies etwas, das Sie verwenden und bauen müssen, wenn Sie es nicht haben, weil Sie den anderen Weg eingeschlagen haben?

Grundsätzlich geht es darum, worauf es ankommt:

  • Bietet alles, was Sie brauchen (wenn Sie nicht alles bieten, was Sie brauchen, müssen Sie den geringsten Arbeitsaufwand leisten).
  • Bietet die geringste Menge an Müll, die Sie nicht verwenden werden, die Sie jedoch ertragen müssen.

Alle Argumente, die nicht auf dem Weg sind, was Sie erreichen müssen, sind irrelevant und sollten Ihre Entscheidung nicht berücksichtigen.


1
WCF Data Service-Modelle sind POCO-Modelle. Voraussetzung ist lediglich ein [Name] -ID-Feld iirc.
Maslow

11

Steck meine zwei Cent rein.

Als Manager sollten Sie Ihre Teamkollegen bitten, das Yagni-Prinzip zu beachten . Dies wird dazu beitragen, die Liste der von beiden Teams vorgebrachten Gründe zu reduzieren.

Unsere Nutzung würde hauptsächlich für das Web erfolgen, und wir würden unsere Dienste über HTTP verfügbar machen. In einigen Fällen (etwa 5 bis 10 Prozent) benötigen wir jedoch möglicherweise verteilte Transaktionen.

Anstatt sich auf verteilte Transaktionen einzulassen, sollten Sie stattdessen die Vergütung in Betracht ziehen .

Als letztes muss die Lernkurve berücksichtigt werden. Abhängig von der Frist Ihres Projekts sollten Sie als Manager entscheiden können, ob es in Ordnung ist, eine neue Technologie zu erlernen oder nicht.

Wenn Sie viel Zeit zum Verschwenden haben, sollten Sie sich auf einen Innovationstag einlassen, an dem Team A und B einen Tag Zeit haben, um Konzepte auf der Grundlage derselben Anforderungen nachzuweisen.

Übrigens, sagen Sie dem Typen, der sagt, " WCF-Modelle sind aufgrund von [DataContract] & [DataMember] und diesen Attributen keine POCOs", dass POCOs im Allgemeinen als Domain-Entitäten gedacht sind und dass es keine bewährte Methode ist, sie offenzulegen Ihre Domain Objekt für jede Art von Kunden, das ist, wofür DTOs sind.


+1 für die Nichtveröffentlichung von Domain-Objekten im Fassaden- / externen Vertrag. Mindestens 10-mal für die billigen Gewinne ausgeführt und in 9 Fällen aufgrund des Mangels an einem festen Kommunikationsvertrag und der Verwaltung eines Domain-Wechsels überarbeitet. +1 für verteilte Transaktionen, es ist eine sehr böse Sache ..
user1496062

5

Was sollte ich jetzt tun? Wie gehe ich konstruktiv mit dieser Debatte um?

Halten Sie zunächst die Subjektivität fern. In Ihren Argumenten des WebAPI Teams, finde ich „Web - API nur der moderne Weg ist , “ * „WCF - Modelle nicht POCO sind, weil diese Attribute“ und „SOAP ist nicht so lesbar und handlich wie JSON“ ziemlich eigenwillig, wenn nicht nur falsch , und wird nicht helfen, eine Entscheidung zu treffen.

Also, was zu tun ist: Entscheiden Sie, was Sie mit Ihren Diensten tun möchten , und wählen Sie dann eine Technik aus, die diesem Ziel und seiner Wartbarkeit und Erweiterbarkeit mit dem geringsten Aufwand gerecht wird. Sie können dies tun, indem Sie einfach untersuchen, ob ein bestimmter Aspekt von dem zu verwendenden Framework unterstützt wird.

Interessantes Lesematerial:

* Hinweis: Sie hierfür auf Wikipedia verweisen, wo das Zitat ist: Web 2.0 Web - Anwendungen haben bewegt von einer serviceorientierten Architektur (SOA) mit SOAP-basierten Web - Service zu mehr Zusammenhalt Sammlungen von RESTful Web - Ressourcen weg“ . Dies ist ein Beispiel für die Verwendung, wenn Ihr Service von einer Webseite aus genutzt werden soll. Dies kann auch problemlos mit WCF mithilfe von WebHttpBinding durchgeführt werden. Es heißt nicht "Verwenden Sie WebAPI für diese" .

Wenn diese Frage über das "Verwalten der Diskussion" hinausgeht : Ich würde WCF verwenden, wenn die Dienste von Nicht-Web-Clients genutzt werden sollen, da ihre Metadaten eine erstaunlich einfache, stark typisierte Client-Generierung ermöglichen.


1
Nicht nur das. " XYZ ist nur die moderne Art " ist ein NULL-Argument, das normalerweise so lautet: " Ich habe keine wirklichen Argumente, aber es ist mein persönlicher Favorit der Saison. "
JensG

4

Abgesehen von der Teamleitung wählen Sie nicht eine über die andere. Sie müssen den Zweck jedes Webdienstes untersuchen und die entsprechende Technologie für den spezifischen Teil der Anwendung verwenden. Es ist wie das Verbot von Geschäftsvorgängen, wenn das Team das Entity-Framework verwendet.

Unsere Nutzung würde hauptsächlich für das Web erfolgen, und wir würden unsere Dienste über HTTP verfügbar machen. In einigen Fällen (etwa 5 bis 10 Prozent) benötigen wir jedoch möglicherweise verteilte Transaktionen.

Dann schreiben Sie diese 5 ~ 10% Webservices in WCF. Wenn der Service in anderen Projekten intern referenziert werden soll, gibt es keine Debatte. Der Vorteil der Möglichkeit, einen WCF-Vertrag zum Erstellen des Client-Proxys zu importieren, steht NICHT zur Diskussion. Es bringt die gesamte Integration, Effizienz und Typensicherheit auf ein völlig neues Niveau.

Sie schreiben, was für öffentliche API (möglicherweise) / Ajax-Anforderungen in der Asp.net-Web-API verwendet werden soll.

Wenn es sich nur um einen seitenbezogenen Ajax-Aufruf handelt, können Sie einfach Asp.Net MVC verwenden.

Wähle nicht, umarme sie alle. WCF und Asp.net Web API dienen unterschiedlichen Zwecken. Niemand sagt, Sie können weder Apfel noch Orange in Ihrem Obstsalat haben. Der Versuch, eines über das andere zu heben und jedes einzelne Szenario herunterzuschieben, ist einfach nur Faulheit.


4

Unser Team hatte vor ein paar Monaten eine ähnliche Diskussion. Der entscheidende Faktor für uns war, wie wir jede Technologie entwickeln und implementieren. Da wir bereits eine MVC-Anwendung erstellt und Knockout.js für die Datenbindung verwendet haben, haben wir MVVM effektiv verwendet, wobei die Controller nur eine API für Daten sind.

Dies ermöglichte uns, unseren Einsatz der Technologien bei diesem Projekt wie folgt zu kategorisieren:

  • Die Web-API wird als API für Knockout- und Ajax-Aufrufe verwendet und macht sie zu unseren Befehlen für das MVVM-Muster. Unsere Geschäftslogik für die Webanwendung wird durch eine Reihe von Klassen, Repositorys und Fabriken hinter dieser Ebene zusammengefasst.
  • WCF wird dann für unseren Datenspeicher verwendet und legt Daten aus unserer Datenbank nicht nur für diese Website offen, sondern auch für jede andere Website oder jeden anderen Dienst, der die offen gelegten Daten verwendet.

Dies ist möglicherweise keine beliebte oder hypertechnische Antwort. Die Entscheidung darüber, was Sie zuerst benötigen und wie oder ob die Technologie hilfreich ist, hat meinem Team geholfen, zu entscheiden, welche Technologie wo eingesetzt werden soll.


Wie geht Ihre WCF-Ebene mit Auth um?
Maslow

3

Mit anderen Worten, wir sollten besser die Web-API verwenden, wenn wir einen Dienst über HTTP verfügbar machen möchten, aber wenn es um TCP und Duplex geht, sollten wir WCF verwenden.

Das wäre der vernünftigste Ansatz. Es ist durchaus üblich, dass sowohl WCF- als auch WebApi-Dienste in derselben Webanwendung vorhanden sind und beide unterschiedliche Zwecke erfüllen.

Nur um ein paar Argumente zu korrigieren:

WCF-Modelle sind aufgrund von [DataContract] & [DataMember] und diesen Attributen nicht POCO

In vielen Fällen funktionieren WCF-Modelle ohne Datenvertrags- / Datenelementattribute.

SOAP ist nicht so lesbar und handlich wie JSON

Es ist nicht wahr, aber WCF-Webdienste enthalten normalerweise einfaches XML und kein aufgeblähtes SOAP. Dies ist definitiv ist lesbar.

Ein Argument für WCF: Wenn eine WSDL verfügbar ist, gibt es Unmengen von Tools in fast allen Technologien, die Proxys aus den Metadaten erstellen können. Andererseits wird das JSON-Schema noch nicht überall unterstützt.


2

Warum gehen Sie nicht mit WCF Data Services die Linie? nette Abfragen im OData / Webapi-Stil und Benutzerfreundlichkeit mit den Kräften von WCF und der Fähigkeit, einwandfrei zurückzukehren JSON. Auch Wcf ist nicht so schlimm, wenn Sie einen netten automatischen Wcf-Hosting-Code wie den folgenden haben:

https://github.com/ImaginaryDevelopment/MvcOdata

Ich würde sagen, sie sind überhaupt nicht weit voneinander entfernt, außer dass wir uns bei der Verwendung WebApiim Front-End und WCF data servicesin der mittleren Ebene WebApimit einfachen Dingen wie String-Enthalten oder String-Matching-Odata-Operatoren befasst haben.


1

Ein guter Architekt verzögert Technologieentscheidungen, bis sie absolut notwendig sind.

Mit anderen Worten, treffen Sie die Entscheidung erst, wenn ein Client tatsächlich eine Verbindung herstellen muss. Sie können eine vollständig getestete Serviceschicht erstellen, ohne einen Transport- / Kommunikationsmechanismus darüber zu legen. Über 95% der Arbeiten können "unterhalb" des Adapters außerhalb des Frameworks ausgeführt werden.

Wenn Sie diese Dienste für Remoteclients verfügbar machen möchten, können Sie das trendigste Framework von der Stange auswählen und Thin Wrapper über eine vielseitige Serviceebene schreiben.

Zur Hölle, wenn Ihre "echte" Service-Schicht gut gemacht ist, können Sie sogar mehrere Wrapper mit minimalem Aufwand ausprobieren.

Das ist jedenfalls die dogmatische Antwort. In der Praxis möchten Sie möglicherweise das einfachste Tool von der Stange nehmen, um frühzeitige und häufige Integrationstests zu ermöglichen. Beschränken Sie jedoch Ihre Abhängigkeit und behandeln Sie es strikt als eine einfache Kommunikationsschicht über den tatsächlichen Diensten.


Wenn Sie diesen Ansatz wählen, werden Sie wahrscheinlich feststellen, dass Sie das am einfachsten zu verwendende Tool auswählen, und niemand wird Probleme damit haben , da das Team weiß, dass es später ein ausgefeilteres oder trendigeres Tool oder Framework bei Bedarf mit minimalem Aufwand implementieren kann.


Zugegeben, diese Antwort ist sehr spät im Spiel - aber ich war wirklich überrascht zu sehen, dass keine der populären Antworten die dogmatische Antwort "noch nicht einmal die endgültige Entscheidung treffen" wieder
aufflammte

0

Daher stehe ich jetzt vor der gleichen Wahl. Ich habe mich gefragt, welche Teilmenge der Funktionen von WCF unser Team derzeit verwendet. Verwenden wir unterschiedliche Protokolle? Nein. Nutzen wir die Transaktionsunterstützung? Nein (obwohl wir benutzerdefinierte Konsistenzmechanismen verwenden). Verwenden wir Duplex? Nein.

Warum möchten wir die Web-API verwenden? Einfachere Frontend-Integration (entfernt zusätzliche Service-Schicht), SignalR für Push-Antworten an Clients, Caching für GETs.

Vielleicht könnte man andere Gründe finden :) Auch Gründe, bei WCF zu bleiben.


2
Das OP fragt nicht nach WCF im Vergleich zur Web-API, sondern nach der Verwaltung der internen technischen Debatte, die sein Team führt. Ihre Antwort vermisst den weiteren Teil der Frage.

0

Wenn ich in Ihrer Position wäre, würde ich zunächst die Fähigkeiten Ihres Teams untersuchen. Wenn jeder in Ihrem Team WCF bereits kennt und nur ein geringer Prozentsatz die Web-API kennt, ist Ihre Entscheidung bereits für Sie getroffen.

Wenn Sie die Zeit haben, investieren Sie sie auf jeden Fall in das Lernen und die Verbesserung Ihrer Wissensbasis, jedoch nicht auf Kosten der geschäftlichen Anforderungen und der Produktivität des Unternehmens.


0

Ich würde fragen, welches Interaktionsmodell Sie unterstützen müssen. Entspricht Ihre gewünschte externe Schnittstelle eher RPC oder REST? Nach meiner Erfahrung liegt es normalerweise irgendwo dazwischen, aber meistens zwischen dem einen und dem anderen.

Konsumieren Sie Ihre eigenen Dienste für andere Projekte in .Net? Dies ist wahrscheinlich die aufschlussreichste Frage, die Sie stellen können. WCF bietet den Vorteil, dass Sie Ihre Schnittstellen in eine separate Klassenbibliothek abstrahieren und Ihren Client erstellen und einbinden können. Als Erweiterung dazu können Sie Ihr WCF-basiertes Projekt sowohl mit JSON- als auch mit SOAP / WSDL-Endpunkten bereitstellen. WCF bietet auch bessere Sicherheiten gegenüber Ihren definierten Schnittstellen.

Wenn Sie jedoch generell erwarten, dass Clients von anderen XML-Plattformen stammen, hat SOAP einen messbaren Overhead, der über die einfachen JSON-Endpunkte hinausgeht. Wenn Sie sich für die JSON / Web-API entscheiden, müssen Sie besser dokumentieren, wie Sie mit Ihren Endpunkten und der API interagieren.

Im Allgemeinen würde ich vorschlagen, ein einfaches API-Dokument zu schreiben, in dem angegeben ist, wie Sie Daten übermitteln und wie Sie auf eine einzelne Anforderungsobjektstruktur antworten möchten. Schreiben Sie Ihren Testfall so universell wie möglich und dokumentieren Sie ihn als solchen. Ich würde eine einfache Locke Aussage empfehlen. Lassen Sie dann mehrere Ihrer Mitglieder dies mithilfe von WCF und der Web-API implementieren. Dann sehen Sie, welche gewinnt.

Persönlich neige ich, obwohl ich einige relativ große Projekte und Implementierungen mit WCF durchgeführt habe, zur einfachsten Implementierung, die meines Erachtens in der Verwendung von JSON-Ergebnissen und einem gewissen Überschreibungsverhalten in Global.asax.cs für den Umgang mit Fehlerbedingungen liegt. Wenn die Dokumentation einer API curl-Anweisungen enthält und Sie die gesamte Funktionalität Ihrer API mit curl-Beispielen ausüben können, können Clients viel einfacher in jeder Sprache implementiert werden, die Webschnittstellen unterstützt. Dies ist wirklich, wo WCF beginnt zu fallen. Eine gut definierte API mit agnostischer Dokumentation ist besser als Strukturen mit automatisierten Werkzeugen im Umgang mit fremden Systemen. Als Verbraucher dieser Systeme von anderen Plattformen sprechen.

Darüber hinaus können Sie Ihren Client in zwei verschiedenen Sprachen implementieren. Machen Sie einen Client in C #, aber machen Sie auch einen in Node.js oder Python und sehen Sie, wie gut sie tatsächlich passen. Diese Übung allein wird Ihnen helfen, die losen Enden in Ihrer API auszuräumen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.