ServiceStack vs ASP.Net Web API [geschlossen]

299

Ich möchte eine neue API im REST-Stil schreiben und habe mir ServiceStack angesehen und es gefällt mir sehr gut. Ich habe jedoch festgestellt, dass Microsoft das ASP.Net-Web-API-Projekt als Teil der neuen MVC 4-Beta veröffentlicht hat. Hat sich jemand das neue Web-API-Projekt angesehen? Können Sie Vor- und Nachteile für jedes System angeben?

Flipchart
quelle

Antworten:

389

Sie haben sehr ähnliche Anwendungsfälle, da ich als leitender Betreuer des ServiceStack-Projekts einen guten Einblick in die Vorteile von ServiceStack und die vielen natürlichen Vorteile seines nachrichtenbasierten Designs habe .

ServiceStack gibt es seit 2008 als OSS-Projekt von Anfang an mit dem einzigen Ziel, das korrekte Design und die Implementierung reibungsloser Remote-Dienste zu fördern.

Einfaches und elegantes Design

In seinem Streben nach ultimativer Einfachheit basiert es auf einem einfachen und eleganten Kern - wobei die meisten Funktionen natürlich an Ihre Modelle und nicht an Ihre Controller gebunden sind -, wie es MVC, WebApi (und jedes andere von Microsoft erstellte Web Service Framework) tut ).

Die Verwendung eines nachrichtenbasierten Designs bietet einen überlegenen Ansatz für Remotedienste, da sie erweiterbare und weniger spröde Dienste fördern, Zugriffs- und Anrufmuster vereinfachen und viele andere natürliche Vorteile enthalten, die Sie kostenlos erhalten .

Als Kernaufgabe bekämpfen wir die Komplexität in jeder Phase, um eine unsichtbare und nicht aufdringliche API zu erhalten und die Einführung neuer Konzepte oder künstlicher Konstrukte zu vermeiden, die .NET- oder Webdienstentwicklern heute noch nicht vertraut sind.

Als Beispiel ist Ihre IService<T>Service-Implementierung nur eine Standard-C # -Klasse mit automatisch verdrahteten Abhängigkeiten. Dünne und leichte Wrapper werden verwendet, um eine konsistente und einheitliche API für die Kerntypen IHttpRequest und IHttpResponse zur Laufzeit bereitzustellen . Sie ermöglichen auch den Zugriff auf zugrunde liegende ASP.NET- oder HttpListener-Anforderungs- und Antwortklassen, sodass Sie bei der Verwendung von ServiceStack niemals eingeschränkt werden.

Im Gegensatz zu WCF und WebApi

Hier ist eine kurze Übersicht über die gegensätzlichen API-Stile, die ServiceStack und WCF fördern . WebApi unterscheidet sich von WCF darin, dass es das REST-vollständige API-Design fördert. Beispiele zwischen den beiden sind das einzige bekannte Beispiel, das ich mit demselben Dienst habe, der sowohl in ServiceStack als auch in WebApi geschrieben wurde .

Best Practices Remote-Dienste

ServiceStack konzentriert sich in erster Linie auf Einfachheit, Leistung und die Förderung von Best Practices für Web- / Remote-Services, bei denen es darum geht, Martin Fowlers Remote-Service-Entwurfsmuster in einem möglichst idiomatischen C # zu berücksichtigen:

  • Das Fassadenmuster - Dies schlägt die Verwendung von stapelbaren, grobkörnigen Schnittstellen vor, wenn Sie über Prozessgrenzen hinweg kommunizieren.

  • Das DTO-Muster ( MSDN ) - Festlegen der Verwendung von speziellen POCOs zum Generieren des Drahtformats Ihrer Webdienstantworten.

  • Das Gateway-Muster ( MSDN ) zum Einkapseln Ihrer Client- und Serverkommunikation zwischen den Client-Gateway / DTO-Modellen und den Service Interface-Ebenen.

Diese Muster gewährleisten eine saubere Trennung von Bedenken und eine reibungslose iterative Entwicklererfahrung.

Stärken Sie Ihre Dienste

Ein ServiceStack-Webdienst konzentriert sich im Kern auf eine abhängigkeitsfreie und automatisch verdrahtete reine C # IService<T>-Schnittstelle, mit der Sie Ihren Webdienstvertrag mit Ihren eigenen Anforderungs- und Antwort-DTOs mithilfe sauberer POCOs vollständig definieren können. Dadurch wird die API von ServiceStack praktisch unsichtbar und nicht sichtbar -invasiv, dh es ist trivial, Ihre C # -Dienstlogik zu extrahieren und außerhalb eines ServiceStack-Hosts auszuführen.

Diese Übersicht ist ein gutes Beispiel dafür, was Sie mit nur 1 C # .cs-Klasse in ServiceStack erhalten :

  • Metadatenseiten für alle registrierten Formate
    • Mit Links zu WSDLs, XSDs und C # -Client-Beispielen
  • Menschenfreundliche HTML-Berichtsansicht
    • Ein einzelner in sich geschlossener HTML-Seiten-Snapshot (dh keine externen Refs). Enthält eine eingebettete JSON-Webdienstantwort - ermöglicht den programmgesteuerten Zugriff auf Datenschnappschüsse.
  • Eingebauter Mini Profiler (Port des exzellenten MVC Mini Profiler )
    • Beinhaltet SQL-Profilerstellung
  • JSON / JSONP-, XML-, JSV-, CSV- und SOAP-Endpunkte

Die Klassen RestServiceBase und ServiceBase sollen Ihre benutzerdefinierte C # -Logik für eine maximale mögliche Wiederverwendung hosten, z. B. ermöglicht das DTO-First-Design trivial eine verzögerte und Proxy-Ausführung, bei der derselbe C # -Dienst auch auf einem MQ-Host gehostet und ausgeführt werden kann Dies passiert, wenn Sie einen IMessageServicewie den RedisMQ-Host registrieren und Ihren Dienst über den /asynconewayEndpunkt anrufen (dh client.SendOneWay()in C # -Clients).

Sie können Composite-Services auch einfach delegieren und erstellen, indem Sie die base.ResolveService<T>()Methode verwenden, die eine automatisch verdrahtete Instanz des ausgewählten Service zurückgibt, wie im Beispiel des Nortwind CustomerDetails-Service dargestellt :

var ordersService = base.ResolveService<OrdersService>();
var ordersResponse = (OrdersResponse)ordersService.Get(
    new Orders { CustomerId = customer.Id });

Geben Sie einfache C # -Objekte zurück

Zum größten Teil serialisiert ServiceStack die meisten C # -Objekte wie erwartet - hier eine Liste möglicher Rückgabetypen ( aus dieser Antwort ):

  • Jedes DTO-Objekt -> serialisiert zu Response ContentType
  • HttpResult, HttpError, CompressedResult (IHttpResult) für benutzerdefinierte HTTP-Antwort

Die folgenden Typen werden nicht konvertiert und direkt in den Antwortstrom geschrieben:

  • String
  • Strom
  • IStreamWriter
  • Byte [] - mit dem Inhaltstyp application / octet-stream.

Ein Beispiel für die Unterstützung von benutzerdefinierten HTTP-Headern finden Sie in diesem CORS-Beispiel, in dem Sie HTTP-Header global oder pro Dienst konfigurieren können.

HTML-Unterstützung

Es gibt mehrere Optionen für die Rückgabe von HTML in ServiceStack, die hier ausführlich erläutert werden .

Enthält die schnellsten Text- und Binärserialisierer für .NET

Ausfallsichere und schnelle Serialisierer sind in einer API von größter Bedeutung, um schnelle Antwortzeiten und eine versionierbare API zu gewährleisten, die vorhandene Clients nicht beschädigt. Aus diesem Grund enthält ServiceStack die schnellsten Textserialisierer für .NET mit einer NuGet-Option zum Aktivieren des Protokolls von @marcgravell Puffer (.NETs schnellster binärer Serializer).

Die Textserialisierer von ServiceStack sind sehr belastbar und können ohne Fehler einer extremen Versionierung standhalten .

Reibungslose Entwicklererfahrung von Ende zu Ende

Die Meinung von ServiceStack ermöglicht eine schnelle, typisierte, knappe Web-Service-API von Ende zu Ende mit integrierter Unterstützung für Sync / Async C # /. NET- und Async Silverlight-Clients ohne Code-Gen:

C # -Beispiel synchronisieren

var response = client.Send<HelloResponse>(new Hello { Name = "World!" });

Async C # Beispiel

client.SendAsync<HelloResponse>(new Hello { Name = "World!" },
    r => Console.WriteLine(r.Result), (r, ex) => { throw ex; });

Da es nur reines JSON zurückgibt, wird es auch trivial mit anderen HTTP-Clients verwendet, z. B. JS-Client-Beispiel mit jQuery :

$.getJSON("http://localhost/Backbone.Todo/todos", function(todos) {
    alert(todos.length == 1);
});

Sehr gut testbar

Alle C # /. NET ServiceClients verwenden dieselben Schnittstellen, sodass sie in hohem Maße testbar und austauschbar sind, sodass Sie denselben Komponententest auch als XML-, JSON-, JSV- und SOAP-Integrationstest verwenden können .

Integrierte umfassende Validierung und Fehlerbehandlung

In seiner Mission, eine reibungslose und saubere Entwicklererfahrung zu bieten, umfasst ServiceStack auch die integrierte typisierte Validierung und Fehlerbehandlung , bei der das Auslösen einer C # -Ausnahme oder die Verwendung der integrierten Fluent-Validierung Clients strukturierte, typisierte Fehler bietet, auf die Webdienst-Clients leicht zugreifen können , z.B:

try {
    var client = new JsonServiceClient(BaseUri);
    var response = client.Send<UserResponse>(new User());
} catch (WebServiceException webEx) {
    /*
      webEx.StatusCode  = 400
      webEx.ErrorCode   = ArgumentNullException
      webEx.Message     = Value cannot be null. Parameter name: Name
      webEx.StackTrace  = (your Server Exception StackTrace - if DebugMode is enabled)
      webEx.ResponseDto = (your populated Response DTO)
      webEx.ResponseStatus   = (your populated Response Status DTO)
      webEx.GetFieldErrors() = (individual errors for each field if any)
    */
}

Um es trivial zu machen, Fehler in JavaScript zu konsumieren, können Sie die einfache JavaScript-Bibliothek ss -alid.js verwenden, um Ihre Antwortfehler mit einer einzigen Codezeile trivial an Ihre HTML-Formularfelder zu binden. Das Beispielprojekt SocialBootstrapApi bietet eine gute Demo dafür.

Umfangreiche Integration mit ASP.NET und MVC

Das ServiceStack MVC PowerPack schreibt viele Probleme von ASP.NET und MVC neu und behebt sie, indem es die lähmenden Session- und Caching-XML-belasteten ASP.NET-Anbieter mit einer eigenen sauberen und abhängigkeitsfreien Implementierung von ICacheClient- und ISession-APIs ersetzt.

ServiceStack enthält auch ein neueres und saubereres Modell für Authentifizierungs- und Autorisierungsanbieter mit einer Reihe verschiedener integrierter AuthProvider:

  • Anmeldeinformationen - Zur Authentifizierung mit Anmeldeinformationen für Benutzername / Kennwort durch Senden an den Dienst / auth / credentials
  • Basisauthentifizierung - Ermöglicht Benutzern die Authentifizierung mit der Basisauthentifizierung
  • Twitter OAuth - Benutzer können sich bei Twitter registrieren und authentifizieren
  • Facebook OAuth - Benutzer können sich bei Facebook registrieren und authentifizieren

Das Authentifizierungsmodul ist völlig optional und basiert auf den sauberen ICacheClient / ISession-APIs und OrmLite, mit denen Ihre Sitzungen in Memory, Redis oder Memcached gespeichert werden können und Ihre UserAuth-Informationen in den von OrmLite unterstützten RDBMS von SQLServer, MySql, PostgreSQL, Sqlite as gespeichert bleiben sowie Redis Data-Store oder InMemory (nützlich für Entwickler / Tests).

Großartige Dokumentation

ServiceStack ist sehr gut dokumentiert, wo die meisten Informationen über das Framework im GitHub-Wiki gehostet werden . Die Dokumentation für andere Teile des Frameworks (z. B. Serializer, Redis, OrmLite) finden Sie unter servicestack.net/docs/.

Das ServiceStack.Examples- Projekt bietet den Quellcode für alle Live-Demos und Starter-Vorlagen von ServiceStack, während das SocialBoostsrapApi-Projekt einen hervorragenden Ausgangspunkt für die Entwicklung einer Backbone.js-Single-Page-App mit ServiceStack und MVC auf der Basis der Twitters Bootstrap-Vorlage bietet.

Darüber hinaus enthält die Google-Gruppe einen Schatz an Informationen, der in den letzten Jahren erheblich zugenommen hat.

Läuft überall

ServiceStack ist ein .NET 3.5-Framework, das auf ASP.NET- und HttpListener-Hosts ausgeführt wird und entweder auf .NET oder Mono gehostet werden kann ( Wissenswertes : www.servicestack.net wird von CentOS / Mono unterstützt). Auf diese Weise können Ihre ServiceStack-Webdienste auf folgenden Websites gehostet werden:

Windows mit .NET 3.5 & 4.0

Linux / OSX mit Mono

  • Apache + mod_mono
  • Nginx + MonoFastCGI
  • XSP
  • Konsolen-App

Entwickelt mit dem Open Source-Entwicklungsmodell

ServiceStack glaubt fest an das Open Source-Entwicklungsmodell, bei dem es aktiv im Freien entwickelt wird und seit seiner Einführung immer unter einer liberalen OSS-Lizenz (New BSD) gehostet wird . Bis heute hat es Beiträge von mehr als 47 Entwicklern erhalten und steht derzeit am dritthäufigsten C # -Projekt auf GitHub .

Nachteile

Ich glaube, der größte Nachteil ist der gleiche für die meisten anderen OSS .NET-Projekte, bei denen es nicht von Microsoft entwickelt (oder sogar als verfügbare Option aufgeführt) wurde. Dies bedeutet, dass es bei der Bewertung eines Frameworks selten die erste Wahl ist. Die meisten Anwender bewerten ServiceStack nur als letzten Ausweg, wenn sie entweder frustriert sind über die Reibung und Sprödigkeit von WCF oder die Leistung des bevorzugten Microsoft Stacks.

Feedback und Community-Ressourcen

ServiceStack wurde von den meisten Personen, die es als durch die positive Stimmung in der Mailinggruppe sichtbar bewertet haben, sehr positiv aufgenommen . Seit diesem Jahr verfolgt der Twitter-Account von @ServiceStack Erwähnungen und Feedback in seinen Favoriten .

Die Wiki-Seite für Community-Ressourcen ist ein guter Ort, um mehr über ServiceStack in the Wild mit Links zu Blog-Posts, Pod Casts, Präsentationen, Gists und mehr zu erfahren.

Mythos
quelle
30
Bleiben Sie als jemand, der versucht hat, WCF, Webapi und jetzt ServiceStack zu verwenden, bei ServiceStack. 1) WCF ist für die meisten unnötig zu komplex. Es ist das alte Delima "Lasst uns alle Probleme lösen". 2) Web-API ist zu neu. Warten Sie auf die endgültige Veröffentlichung. Es werden nicht einmal Beiträge von mehrteiligen Formularen unterstützt. Der Code befindet sich im Fluss. Ich würde keine kommerziellen Apps darauf ausführen. Übrigens sollte diese Frage nicht geschlossen werden.
Michael Silver
13
Könnten Sie dies bitte für die gerade veröffentlichte ASP.NET-WebAPI bearbeiten?
Blake Niemyjski
26
Bitte machen Sie Ihre Website benutzerfreundlicher. Dies scheint ein großartiges Werkzeug zu sein. Aber Ihre Website ist verwirrend. Es ist nicht klar, was das Projekt ist und was es lösen soll. Im Gegensatz dazu ist diese Antwort fantastisch.
Kugel
82
Dies scheint wirklich kein großer Vergleich mit der Web-API zu sein. Es macht Sinn - zum Zeitpunkt der Antwort war die Web-API brandneu. Dies ist nicht mehr der Fall. Ich würde wirklich gerne einen tatsächlichen Zusammenbruch sehen und ich fürchte, diese Antwort ist veraltet.
George Mauer
35
Es kann erwähnenswert sein, dass ServiceStack ab Version 4.0 auf eine reine kommerzielle / binäre Distribution umstellt. Weitere Informationen finden Sie im Google+ Beitrag von Demis .
Nick Jones
137

Es gibt einen neuen Hauptunterschied, der berücksichtigt werden muss: ServiceStack kann ab Version 4 nicht mehr kostenlos verwendet werden. Da es auf den SS-Profis eine ziemlich definitive Antwort gibt, wollte ich ein paar für die Web-API rausschmeißen

Web-API

Profis:

  1. Kostenlose Verwendung in Ihrem Projekt (vorausgesetzt, Sie haben eine VS-Lizenz, die die kommerzielle Nutzung ermöglicht)
  2. Außergewöhnlich hoher kostenloser Support von Microsoft und im gesamten Web, einschließlich hier auf StackOverflow.com.
  3. Lässt sich schnell in andere Microsoft-Technologie-Stacks wie ASP.NET MVC integrieren, das in Microsoft-Shops äußerst beliebt ist
  4. Integrierte Unterstützung für die RESTful-Authentifizierung und -Autorisierung in Ihrem Microsoft-Stack

Con's:

  1. Unterstützt SOAP nicht

Nebenleistungen

(Bitte hinterlassen Sie unten Kommentare, um hinzuzufügen, warum die Web-API Vorteile oder Vor- / Nachteile hat, die ich hinzufügen kann.)

PW Kad
quelle
84
Ich
bin
11
Die Tatsache, dass MVC und WebAPI nebeneinander existieren, ist ein CON.
Phill
4
ServiceStack v3 ist immer noch kostenlos und AFAIK wird es immer sein. Ich glaube nicht, dass irgendetwas, was mythz erwähnt, v4-spezifisch ist.
Kyle Gobel
14
Wow, "nicht mehr frei" ist eine Untertreibung. 999 USD pro Entwickler für ein Unternehmen mit mehr als zehn Mitarbeitern?
Ryan Lundy
7
Mein Hauptgrund für den Wechsel von Service Stack zu Web API ist, dass Service Stack v3 unter iOS (mit Xamarin) mit der neuen 64-Bit-Architektur nicht mehr unterstützt wird. Natürlich sind die Updates in Version 4, der kostenpflichtigen Version.
SgtRock
21

Ich kann nicht wirklich viel über ServiceStack sagen, aber die Web-API hat viele großartige Funktionen und ist derzeit in Version 2.

Einige der Dinge, die Sie mit der Web-API tun können:

  • Selbsthost in einer OWIN-Anwendung (dh läuft überall).
  • Volle Unterstützung für asyncund await.
  • Gute Standardvorlagen und jede Menge Open Source-Beispiele.
  • Verwendeter großartiger Json.Net JSON-Serializer.
  • Standardmäßig Ruhe (Sie müssen selbst Hypermedia machen).
  • und mehr...
user3377837
quelle
1
Alles in dieser Liste ist auch in ServiceStack vorhanden oder kann als Betrug angesehen werden. ServiceStack JSON Serializer, obwohl weniger beliebt, ist viel viel schneller als JSON.NET. Es ist unwahrscheinlich, dass die OWIN-Unterstützung implementiert wird, da @mythz eine starke Meinung zu dieser Technologie hat, die ziemlich solide ist ( siehe seine Kommentare zu dieser Funktionsanforderung ).
Ygormutti
3
Wenn ich mir das OWIN-Nuget-Paket anschaue, das seit seiner Veröffentlichung vor drei Jahren nicht mehr aktualisiert wurde, sehe ich in diesem ganzen Hype um die OWIN-Unterstützung nicht wirklich den Sinn. Es sieht so aus, als wollten die Leute wirklich OWIN haben, weil Microsoft einmal gesagt hat, es sei cool. Sonst würden Sie wahrscheinlich nie von OWIN hören. Microsoft ließ es glücklich zugunsten seines neuen Spielzeugs K fallen. Dies mildert das Argument "Microsoft steckt dahinter, damit es für immer leben wird", da Microsoft eine starke Tendenz hat, Projekte zu töten, die stark von ihnen vorangetrieben wurden.
Alexey Zimarev
Warum antworten, wenn Sie keine Erfahrung mit ServiceStack haben?
Brian Ogden
6

Als Kunde von ServiceStack ist hier der für mich wichtigste Profi für ServiceStack.

https://github.com/ServiceStack/Issues/issues/606

So. Fehler gefunden, Fehler identifiziert, Fehler behoben. Gleicher Tag. Außergewöhnliche Unterstützung!

labilbe
quelle
3

Es ist ein Jahr her, dass ich SS benutze und es ist alles großartig. ORMLite ist pure Magie. Ich konnte eine schreckliche MySQL-Datenbank neu zuordnen, um sie in mobile Apps zu integrieren. Keine Änderung an der Datenbank, da sie mit einem PHP-Backend mit anderen Apps verwendet wird ...

Mythz ist ein Beispiel für Unterstützung und Erklärung. Es hat mein Wissen über das Design von Apps und die Einfachheit der Wartung verbessert. Bitte versuchen Sie es und Sie werden verstehen.

Vergleichen Sie SS auch nicht mit WebAPI. Es ist nicht genug, SS bringt viel mehr in Ihre Toolbox. ServiceStack.Text ist auch ein großartiger Automapper.

André Leblanc
quelle