Verwenden von WebAPI oder MVC zum Zurückgeben von JSON in ASP.NET

138

Ich erstelle eine ASP.NET MVC-Anwendung, die Client-Skript-lastig ist und JSON und jQuery verwendet, um das DOM zu bearbeiten.

Meines Wissens nach können sowohl Web API Controller als auch MVC Controller JSON zurückgeben.

Sollte ich in meinem Szenario einen Web-API-Controller oder einen MVC-Controller verwenden ?

Nil Pun
quelle
1
Es ist wichtig zu beachten, dass diese Frage spezifisch für einen bestimmten Kontext ist: Der Autor möchte wissen, welcher Controller verwendet werden soll, wenn NUR json zurückgegeben werden soll. Eine REST-API ermöglicht je nach Inhaltsverhandlung unterschiedliche Medienformatierungen (z. B. XML akzeptieren, JSON akzeptieren). In diesem Fall ist WebAPI-Controller Ihre beste Option
Sentinel

Antworten:

156

Web-API-Controller können in jeder ASP.NET-Anwendung erstellt und gehostet werden, nicht nur in MVC-Anwendungen. Ein offensichtlicher Grund für die Erstellung einer Web-API ist daher, dass Sie kein MVC-Front-End haben (z. B. klassische, von Ihrem Unternehmen / Ihrer Organisation gehostete RESTful-Webdienste).

MVC-Controller basieren normalerweise auf dem MVC-Framework. Wenn Sie sich die Standardvorlagen und den größten Teil der Arbeit der Community und Ihrer Kollegen ansehen, werden Sie feststellen, dass fast alle MVC-Controller unter Berücksichtigung der Ansicht implementiert sind.

Persönlich verwende ich MVC-Controller, wenn ich mit View () antworten möchte, und ich verwende eine Web-API für alles, was nicht von einer bestimmten Ansicht abhängig ist.

Natürlich gibt es einige Einschränkungen, aber wenn Sie das Modellbindungsverhalten von MVC nicht benötigen, Ihr Dienst datenzentriert ist und die Vorgänge datenzentriert sind (z. B. CRUD-Vorgänge), möchten Sie wahrscheinlich einen Web-API-Controller 'anstelle eines' Model-View Controllers '. Umgekehrt benötigen Sie stattdessen einen MVC-Controller, wenn Ihre Vorgänge auf die Ansicht ausgerichtet sind (z. B. dem Benutzer eine Benutzeradministrationsseite bereitstellen) oder wenn Sie die Modellbindung von MVC benötigen, um "Ajax-Partials" zu generieren (sehr unwahrscheinlich).

Persönlich verwende ich Web-API-Controller, um JSON-basierte RESTful-Clients zu steuern. Ich verwende MVC-Controller, um das grundlegende Browser-Routing und die Bereitstellung des SPA zu verwalten.

Shaun Wilson
quelle
32

WebAPI dient zum Erstellen einer API. Wenn Sie möchten, dass jemand Ihre API in XML, JSON usw. verwenden kann, können Sie eine Web-API erstellen.

In Ihrem Fall müssen Sie nur mit dem Client in JSON sprechen.

Auch wenn Ihre Website hauptsächlich von Client-Skripten gesteuert wird, würden Sie dennoch ASP.NET MVC Controller verwenden, oder? Und da Sie Ihre Controller möglicherweise bereits logisch nach Entitäten unterteilt haben, ist es sinnvoll, diese JSON-Serving-Methoden hinzuzufügen, anstatt eine andere Klasse speziell für die Web-API zu erstellen.

Für Ihre spezielle Situation (wenn ich das richtig verstehe) würde ich mich also an Controller halten.

Muhammad Hasan Khan
quelle
Vielen Dank, gibt es einen Unterschied zwischen der Erstellung von WebAPI und Controller?
Nil Pun
1
@flybyte Ja, Sie müssen von ApiController ableiten, siehe asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammad Hasan Khan
4
Web Api kann JSON sowie die anderen von Ihnen aufgelisteten Methoden ausführen. Controller können nicht (ordentlich) in eine API umgewandelt werden. Wenn der Benutzer also die Voraussicht hat, Fragen zu stellen, würde ich vorschlagen, die skalierbarere / flexiblere Lösung zu verwenden. Es ist nicht so, als ob es wie WCF-Dienste der alten Schule wäre. Die Web-API ist im Allgemeinen sowohl leistungsstark als auch flexibel. Während Sie also nur einfache Szenarien benötigen, bleibt dies Ihnen im Weg. Aber wenn Sie die Kraft haben, sollten Sie sie brauchen
Steve
8

Die Antwort läuft darauf hinaus, Bedenken zu trennen, die Schaffung von Diensten zu beschleunigen und sich eher auf Konventionen als auf Konfigurationen zu verlassen.

Die Hauptverantwortung des Controllers besteht darin, als Koordinator zwischen der Ansicht und Ihrem Modell zu arbeiten, während die Hauptverantwortung der API darin besteht, an Daten zu arbeiten. Im Fall der API-Konventionen ist es wirklich einfach, CRUD-Operationen durchzuführen. Unten finden Sie die Zuordnung zwischen CRUD-Operation und HTTP-Aktionen

  • Zu lesen bekommen
  • POST: Erstellen
  • PUT: Update
  • LÖSCHEN: Löschen

Mit APIs müssen Sie also keine separaten Aktionen erstellen und diese mit HTTP-Aktionen verknüpfen.

Kris
quelle
0

Das einzige Problem, das ich mit ApiController habe, ist, dass es standortbasiert und nicht bereichsbasiert ist. Eine Site kann nur einen Apicontroller-Unterordner haben, in dem Sie Ihre Controller-Methoden benennen können. Es gibt Situationen, in denen Sie den Controller-Namen in verschiedenen Bereichen duplizieren möchten:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Ich erinnere mich, dass es einige benutzerdefinierte Codeeinstellungen gibt, um dies zu tun, aber es funktioniert standardmäßig nicht.

Ramon Chan
quelle
Dies scheint ein Kommentar zu sein, keine Antwort.
Dylan Hayes
Nicht wirklich, was du sagst. Wenn Sie einen Controller Area1XController benennen, können Sie Folgendes tun: domain.com/Area1X/1, einen Controller erstellen: Area2XController und dann mit: domain.com/Area2X/1 ​​darauf zugreifen. Die große Frage ist, warum Sie das sowieso tun wollen. Der Bereichsname ist abstrakt und sagt einem Benutzer nichts. Wenn Sie beispielsweise 4 Bereiche haben, ist es besser, den Namen des Funktionszwecks dafür zu verwenden.
Herman Van Der Blom
0

Ich stimme der Antwort von Shaun Wilson (Top-Antwort) zu, bin mir aber nicht sicher, warum, da ich nur ein bisschen verwirrt bin und immer noch versuche, mit der folgenden (wahrscheinlich falschen) Vorahnung zu verstehen:

  • Verwenden Sie WebAPI Controller, um JSON-Daten an den Client zu senden, damit der Client die Ansichtsmanipulation ausführen kann. Dieser Prozess erfordert KEINE Ansicht, sondern nur eine Antwort auf die so genannte Methode (dh eine Javascript-Anforderung), damit der Client jede clientseitige Manipulation ausführen kann.
  • Verwenden Sie den MVC-Controller, wenn Sie die Daten verwenden müssen, um eine Ansicht während oder direkt nach dem Laden der Seite zu bearbeiten (dh nicht für SPA-Apps).

Sie sehen, ich weiß nur nicht, wie ich hier falsch liege, und bin verwirrt, weil in der letzten Zeile von Shauns Antwort steht: "Ich verwende MVC-Controller für das grundlegende Browser-Routing und die Bereitstellung des SPA." - Vielleicht weiß ich nicht genau, was ein erholsamer Client ist, als ich davon ausgegangen bin, dass es sich um eine JavaScript-Methode handelt, die eine Antwort in JSON-Form erhält. Dies ist der nächstgelegene Beitrag in Stackoverflow, der als Antwort auf meine Frage aus der Ferne in Beziehung gesetzt wurde. Daher beantworte ich diesen Beitrag, anstatt möglicherweise Fragen zu duplizieren.

RH Thorne
quelle
" Verwenden Sie den MVC-Controller, um die Ansicht bereitzustellen " Sie können das SPA in MVC-Partials für die Komposition in eine Ansicht einbinden. ASP.NET MVC-Entwickler sollten dieses Konzept verstehen. Sie können während der Ansichtsgenerierung (z. B. serverseitige Verarbeitung) reguläre Razor + ASP.NET-Funktionen verwenden, um HTML + JS auf dem Client zu rendern. Das Problem, das viele Entwickler hier haben werden, ist die Idee, dass statische HTML + JS-Dateien ein SPA nicht zu einem SPA machen. Manchmal muss der Inhalt dynamisch und benutzerspezifisch sein, aber alle Frameworks beeinträchtigen diese Tatsache. "SPA" und "MVC" schließen sich nicht gegenseitig aus.
Shaun Wilson
0

In diesem Szenario würde ich WebApi empfehlen, da es sich perfekt für die Übertragung solcher Daten auf der Grundlage von Javascript-Anforderungen eignet. Normalerweise werde ich meine WebApi-Controller so entwickeln, dass sie ein JSON-freundliches Objekt zurückgeben, das dann von meinem Javascript einfach analysiert werden kann.

Die einzige Echtzeit, in der Sie eine Aktion auf einem MVC-Controller für diese Art von Dingen verwenden möchten, ist, wenn Sie HTML generieren und Segmente Ihrer Seite durch Javascript-Aufrufe ersetzen möchten.

Beispielsweise:

Sie haben einen JQuery UI Datepicker, der bei Auswahl eine Liste von Optionsfeldern generiert, die Ereignisse am ausgewählten Tag darstellen.

In diesem Szenario können Sie WebApi verwenden, um JSON zurückzugeben und dann das erforderliche HTML mit Javascript zu generieren. Im Allgemeinen ist es jedoch eine schlechte Praxis, viel HTML mit Javascript zu erstellen. Es wäre viel besser, wenn C # den HTML-Code erstellt und ihn dann über eine Teilansicht zurückgibt, da auf diese Weise weniger Fehler beim Parsen von Javascript auftreten. Ganz zu schweigen davon, dass das HTML viel einfacher zu schreiben ist.

Jezzipin
quelle