download - ServiceStack vs ASP.Net-Web-API




doc tojson (5)

Ich möchte eine neue REST-Stil-API schreiben und habe ServiceStack und so ähnlich angesehen. Ich habe jedoch gesehen, dass Microsoft das ASP.Net-Web-API-Projekt als Teil der neuen MVC 4-Betaversion veröffentlicht hat. Hat jemand das neue Web-API-Projekt angeschaut? Können Sie für jedes System irgendwelche Vor- / Nachteile angeben?


Answers

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

Web-API

Profis:

  1. Kostenlos für Ihr Projekt (vorausgesetzt, Sie haben eine VS-Lizenz, die eine kommerzielle Nutzung erlaubt)
  2. Außergewöhnlich hoher kostenloser Support von Microsoft und im gesamten Web, einschließlich hier auf StackOverflow.com.
  3. Schnelle Integration mit anderen Microsoft-Technologie-Stacks wie ASP.NET MVC, das in Microsoft-Shops äußerst beliebt ist
  4. Integrierte Unterstützung für REST-konforme Authentifizierung und Autorisierung in Ihrem Microsoft-Stack

Nachteile:

  1. Unterstützt SOAP nicht

Nebenleistungen

(Bitte zögern Sie Kommentare unten zu lassen hinzufügen, warum Web-API hat Vorteile oder hat Vor- / Nachteile, die ich hinzufügen kann)


Sie haben sehr ähnliche Anwendungsfälle, als Lead Maintainer für das ServiceStack-Projekt habe ich einen guten Einblick in die Vorteile von ServiceStack und die vielen natürlichen Vorteile seines Message-basierten Designs .

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

Einfaches und elegantes Design

In seinem Streben nach ultimativer Einfachheit ist es um einen einfachen und eleganten Kern aufgebaut - mit den meisten Features, die natürlich an Ihre Modelle gebunden sind, nicht an Ihre Controller - was MVC, WebApi tut (sowie jedes andere Web Service Framework, das Microsoft entwickelt hat) ).

Die Verwendung eines nachrichtenbasierten Designs bietet einen überlegenen Ansatz für Remote-Dienste, da sie erweiterbare und weniger spröde Dienste fördert, Zugangs- und Anrufmuster vereinfacht und viele andere natürliche Vorteile enthält, die Sie kostenlos erhalten .

Als Kernaufgabe kämpfen wir in jeder Phase mit der Komplexität, indem wir eine unsichtbare und nicht intrusive API beibehalten und vermeiden, neue Konzepte oder künstliche Konstrukte einzuführen, die .NET oder Web-Service-Entwicklern heute noch nicht bekannt sind.

Beispielsweise ist Ihre IService<T> nur eine standardmäßige C # -Klasse mit automatisch verketteten Abhängigkeiten. Thin und Lightweight Wrapper werden verwendet, um eine konsistente und einheitliche API um die IHttpRequest - IHttpRequest und IHttpResponse Typen IHttpResponse . Sie ermöglichen auch den Zugriff auf die Request- und Response-Klassen von ASP.NET oder HttpListener, sodass Sie bei der Verwendung von ServiceStack niemals eingeschränkt sind.

Im Gegensatz zu WCF und WebApi

Im Folgenden erhalten Sie einen kurzen Überblick über die kontrastierenden API-Stile, die von ServiceStack und WCF unterstützt werden . WebApi unterscheidet sich von WCF dadurch, dass es REST-ful API-Design fördert. Wie für Beispiele zwischen den 2, dies ist das einzige bekannte Beispiel, das ich mit dem gleichen Service in ServiceStack und WebApi geschrieben habe .

Remote-Services von Best Practices

ServiceStack konzentriert sich hauptsächlich auf Einfachheit, Leistung und die Förderung von Best Practices für Web- / Remote-Services, die darauf ausgerichtet sind, die Design-Patterns von Martin Fowlers so idiomatisch wie möglich zu behandeln:

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

  • Das DTO-Muster ( MSDN ) - Diktieren Sie die Verwendung von speziellen POCOs, um das Drahtformat Ihrer Antworten auf Webdienste zu generieren.

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

Diese Muster gewährleisten eine saubere Trennung von Bedenken und eine reibungsfreie iterative Entwicklungserfahrung.

Befähigen Sie Ihre Dienstleistungen

Ein ServiceStack-Webdienst basiert im Kern auf einer Abhängigkeits-freien und automatisch verkabelten reinen C # IService<T> -Schnittstelle, die Ihnen die IService<T> gibt, Ihren Webservicevertrag mit Ihren eigenen Request- und Response-DTOs unter Verwendung sauberer POCOs zu definieren - Rendering der ServiceStack-API praktisch unsichtbar und nicht-invasiv, dh es ist trivial, Ihre C # -Dienstlogik zu extrahieren und sie außerhalb eines ServiceStack-Hosts auszuführen.

Dieser Hinweis ist ein gutes Beispiel dafür, was Sie mit nur einer C # .cs-Klasse in ServiceStack erhalten :

  • Metadatenseiten für alle registrierten Formate
    • Mit Links zu WSDLs, XSDs und C # -Client-Beispielen
  • Menschliche freundliche HTML-Berichtansicht
    • Ein einzelner in sich abgeschlossener HTML-Seiten-Snapshot (dh keine externen Referenzen). Enthält eingebettete JSON-Webservice-Antworten - ermöglicht den programmgesteuerten Zugriff auf Daten-Snapshots.
  • Eingebauter Mini Profiler (Port des ausgezeichneten MVC Mini Profiler )
    • Beinhaltet Sql Profiling
  • JSON / JSONP-, XML-, JSV-, CSV- und SOAP-Endpunkte

Die RestServiceBase- und ServiceBase-Klassen dienen zum Hosten Ihrer benutzerdefinierten C # -Logik für eine möglichst weitgehende Wiederverwendung, z. B. Das DTO-erste Design ermöglicht eine verzögerte und eingeschränkte Ausführung, bei der derselbe C # -Dienst auch in einem MQ-Host gehostet und ausgeführt werden kann was passiert, wenn Sie einen IMessageService wie den RedisMQ-Host registrieren und Ihren Dienst über den /asynconeway Endpunkt client.SendOneWay() in C # -Clients)

Mit der base.ResolveService<T>() -Methode, die eine automatisch verdrahtete Instanz des ausgewählten Diensts zurückgibt, wie im Beispiel für den Nortwind CustomerDetails-Dienst zu sehen, können Sie auch zusammengesetzte Dienste problemlos delegieren und erstellen:

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

Einfache C # -Objekte zurückgeben

In den meisten Fällen wird ServiceStack die meisten C # -Objekte wie erwartet serialisieren - hier ist eine Liste möglicher Rückgabetypen ( aus dieser Antwort ):

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

Die folgenden Typen werden nicht konvertiert und direkt in den Antwort-Stream geschrieben:

  • Zeichenfolge
  • Strom
  • IStreamWriter
  • byte [] - mit dem Content-Typ "application / octet-stream".

Ein Beispiel für die Unterstützung von benutzerdefinierten HTTP-Headern ist in diesem CORS-Beispiel zu sehen, 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 detailliert erläutert werden .

Enthält schnellste Text- und Binär-Serialisierer für .NET

Elastische und schnelle Serialisierer sind in einer API von vorrangiger Bedeutung, um schnelle Antwortzeiten und eine versionierbare API zu gewährleisten, die bestehende Clients nicht zerstört. Aus diesem Grund enthält ServiceStack die schnellsten Text-Serialisierer für .NET mit einer NuGet-Option zum Aktivieren des @marcgravell - Protokolls Puffer (der schnellste Binär-Serializer von .NET).

ServiceStacks Text-Serializer sind sehr robust und können extremen Versionsfehlern standhalten .

Reibungsfreie Entwicklungserfahrung Ende-zu-Ende

Die eigenwillige Natur von ServiceStack ermöglicht eine schnelle, getippte, übersichtliche Web-Service-API mit integrierter Unterstützung für Sync / Async C # /. NET- und Async Silverlight-Clients ohne Code-Gen:

Sync C # Beispiel

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

Asynchrones 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 mit anderen HTTP-Clients trivial konsumiert, zB JS-Client-Beispiel mit jQuery :

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

In hohem Maße testbar

Alle C # /. NET ServiceClients teilen sich die gleichen Schnittstellen, die sie sehr testbar und austauschbar machen, bis zu dem Punkt, an dem derselbe Komponententest auch als XML-, JSON-, JSV-, SOAP-Integrationstest dienen kann .

Umfangreiche Validierung und Fehlerbehandlung integriert

In seiner Mission, ein reibungsloses und sauberes Entwicklungserlebnis zu bieten, beinhaltet ServiceStack auch typisierte Validierungs- und Fehlerbehandlungsfunktionen , bei denen eine C # -Ausnahme ausgelöst oder die integrierte Fluent-Validierung verwendet wird, um strukturierte, typisierte Fehler für Webservice-Clients leicht zugänglich zu machen , 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 die Verwendung von Fehlern in JavaScript zu vereinfachen, können Sie die JavaScript-Bibliothek ss-validation.js verwenden, um Ihre Antwortfehler mit einer einzigen Codezeile trivial an Ihre HTML-Formularfelder zu binden. Das SocialBootstrapApi-Beispielprojekt bietet eine gute Demo davon.

Rich Integration mit ASP.NET und MVC

Das ServiceStack MVC PowerPack überschreibt und behebt viele Probleme von ASP.NET und MVC mit Ersatz für seine lähmenden Session und Caching XML-belasteten ASP.NET-Provider mit seiner eigenen sauberen und Abhängigkeit-freien Implementierung von ICacheClient und ISession APIs.

ServiceStack enthält auch ein neueres und saubereres Authentifizierungs- und Autorisierungs-Provider-Modell mit einer Reihe verschiedener AuthProviders:

  • Anmeldeinformationen - Zum Authentifizieren mit Benutzernamen / Kennwort-Anmeldeinformationen durch Senden an den / auth / credentials-Dienst
  • Basic Auth - Ermöglicht Benutzern die Authentifizierung mit der Standardauthentifizierung
  • Twitter OAuth - Erlaubt Benutzern, sich bei Twitter zu registrieren und zu authentifizieren
  • Facebook OAuth - Erlaubt Benutzern, sich bei Facebook zu registrieren und zu authentifizieren

Das Authentifizierungsmodul ist vollständig optional und basiert auf den sauberen ICacheClient / ISession APIs und OrmLite, die Ihre Sessions in Memory, Redis oder Memcached speichern und Ihre UserAuth-Informationen in Ormlites unterstützten RDBMS von SQLServer, MySql, PostgreSQL, Sqlite as sowie Redis Data-Store oder InMemory (nützlich für Entwickler / Test).

Tolle Dokumentation

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

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

Darüber hinaus ist in der Google-Gruppe ein Informationsschatz enthalten, der in den letzten Jahren stark angewachsen ist.

Läuft überall

ServiceStack ist ein .NET 3.5-Framework, das auf ASP.NET- und HttpListener-Hosts ausgeführt wird und sowohl auf .NET als auch auf Mono gehostet werden kann ( Wissenswertes : www.servicestack.net wird von CentOS / Mono bereitgestellt ). Auf diese Weise können Ihre ServiceStack-Web-Services auf folgenden Plattformen 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, in dem es aktiv entwickelt wird und seit seiner Einführung immer unter einer liberalen OSS-Lizenz (New BSD) betrieben wurde. Bis heute hat es Beiträge von mehr als 47 Entwicklern erhalten und steht derzeit auf dem dritthäufigsten C # -Projekt auf GitHub .

Nachteile

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

Feedback und Community-Ressourcen

ServiceStack wurde sehr positiv aufgenommen mit positiven Rückmeldungen von den meisten Menschen, die es als positiv für die positive Stimmung in der Mailing-Gruppe bewertet haben. Seit diesem Jahr verfolgt der @ServiceStack Twitter-Account in seinen Favoriten Erwähnungen und Feedback .

Die Community Resources Wiki-Seite ist ein guter Ort, um mehr über ServiceStack in der Wildnis mit Links zu Blogposts, Podcasts, Präsentationen, Gists und mehr zu erfahren.


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

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

  • Self-Host in einer OWIN-Anwendung (dh läuft überall).
  • Volle Unterstützung für async und await .
  • Gute Standardvorlagen und jede Menge Open-Source-Beispiele.
  • Großer Json.Net JSON Serializer.
  • Rest-ish standardmäßig (Sie müssen Hypermedia selbst tun).
  • und mehr...


Grundsätzlich ist ein Web API Controller ein MVC Controller, der anstelle von ActionResponse HttpMessageResponse als Basistyp seiner Antwort ActionResponse . In den meisten anderen Punkten sind sie gleich. Der Hauptunterschied zwischen den Projekttypen besteht darin, dass der Projekttyp " MVC Application " webspezifische Elemente wie Standard- CSS , JavaScript Dateien und andere für eine Website benötigte Ressourcen hinzufügt, die für eine API nicht benötigt werden.

MVC wird zum Erstellen von Websites verwendet. In diesem Fall geben Controllers Regel eine View (dh HTML-Antwort) an Browser-Anfragen zurück. Auf der anderen Seite werden Web-APIs normalerweise dazu verwendet, von anderen Anwendungen konsumiert zu werden. Wenn Sie anderen Anwendungen den Zugriff auf Ihre Daten / Funktionen ermöglichen möchten, können Sie eine Web-API erstellen, um diesen Zugriff zu erleichtern. Zum Beispiel hat Facebook eine API, um es App-Entwicklern zu ermöglichen, auf Informationen über Benutzer zuzugreifen, die die App verwenden. Web-APIs müssen nicht öffentlich genutzt werden. Sie können auch eine API erstellen, um Ihre eigenen Anwendungen zu unterstützen. Zum Beispiel haben wir eine Web-API zur Unterstützung der AJAX-Funktionalität unserer MVC-Website erstellt.

Microsoft hat die Darstellung der verschiedenen Vorlagen geändert. Anstatt unterschiedliche Vorlagen für verschiedene Projekttypen zu verwenden, ermutigen sie Entwickler, ASP.NET-Technologien innerhalb des gleichen Projekts zu mischen. Microsoft nennt dies vNext .

UPDATE: Für ASP.NET Core wurde die Web-API in den MVC 6-Projekttyp und die ApiController Klasse in die Controller Klasse integriert. Weitere Informationen unter: https://wildermuth.com/2016/05/10/Writing-API-Controllers-in-ASP-NET-MVC-6