wake-up-neo.net

Verwenden von WebAPI oder MVC, um JSON in ASP.NET zurückzugeben

Ich baue eine ASP.NET MVC-Anwendung, die ein starkes Client-Skript ist. JSON und jQuery werden dazu verwendet, das DOM zu bearbeiten.

Mein Verständnis ist sowohl Web API Controller als auch MVC Controller kann JSON zurückgeben.

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

134
Nil Pun

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, wenn Sie kein MVC-Frontend haben (z. B. klassische, RESTful-Web-Services, die von Ihrem Unternehmen/Ihrer Organisation gehostet werden.)

MVC-Controller sind in der Regel auf das MVC-Framework angewiesen. Wenn Sie sich die Standardvorlagen anschauen und die meisten Aufgaben der Community und Ihrer Kollegen erledigen, werden Sie feststellen, dass fast alle MVC-Controller mit Blick auf die Ansicht implementiert werden.

Ich persönlich verwende 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ängt. 

Natürlich gibt es Vorbehalte. Wenn Sie jedoch das Modellbindungsverhalten von MVC nicht benötigen, der 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 '. Wenn Ihre Vorgänge dagegen auf View-centric ausgerichtet sind (z. B. die Übergabe einer Benutzer-Admin-Seite an den Benutzer) oder wenn Sie die MVC-Modellbindung benötigen, um "ajax-partials" zu generieren (sehr unwahrscheinlich), benötigen Sie stattdessen einen MVC-Controller.

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

153
Shaun Wilson

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 Clientskripts gesteuert wird, würden Sie dennoch ASP.NET MVC Controller verwenden, oder? Und da Sie Ihre Controller bereits logisch basierend auf Entitäten aufgeteilt haben, ist es sinnvoll, diese Json-Serving-Methoden hinzuzufügen, anstatt eine andere Klasse speziell für Web-API zu erstellen.

Für Ihre spezielle Situation (wenn ich es richtig verstehe) würde ich bei Controllern bleiben.

30

Die Antwort läuft auf die Trennung von Bedenken, die Schaffung von Diensten und die Konvention statt auf die Konfiguration ab. 

Die Hauptaufgabe des Controllers besteht darin, als Koordinator zwischen Ansicht und Ihrem Modell zu arbeiten, während API als Hauptaufgabe die Arbeit an Daten ist. Im Falle der API-Konventionen ist es sehr einfach, CRUD-Operationen durchzuführen. Nachfolgend finden Sie die Zuordnung zwischen CRUD-Vorgängen und HTTP-Aktionen

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

Bei APIs müssen Sie also keine separaten Aktionen erstellen und diese mit HTTP-Aktionen zuordnen.

7
Kris

In diesem Szenario würde ich WebApi empfehlen, da es ideal ist, um Daten wie diese basierend auf Javascript-Anforderungen zu übertragen. Normalerweise entwickle ich meine WebApi-Controller so, dass sie ein JSON-freundliches Objekt zurückgeben, das dann leicht von meinem Javascript analysiert werden kann.

Die einzige wirkliche Zeit, in der Sie eine Aktion auf einem MVC-Controller für diese Art von Aufgaben verwenden möchten, wäre, wenn Sie HTML generieren und Segmente Ihrer Seite durch Javascript-Aufrufe ersetzen möchten.

Zum Beispiel:

Sie haben ein Dateipicker für die JQuery-Benutzeroberfläche, das bei Auswahl eine Liste von Optionsschaltflächen generiert, die Ereignisse am ausgewählten Tag darstellen.

In diesem Szenario können Sie WebApi verwenden, um etwas JSON zurückzugeben und dann den erforderlichen HTML-Code mithilfe von Javascript zu generieren. In der Regel ist es jedoch schlecht, HTML-Code mithilfe von Javascript zu erstellen. Es wäre viel besser, wenn C # den HTML-Code aufbaut und ihn dann über eine Teilansicht zurückgibt, da auf diese Weise Fehler bei der JavaScript-Analyse seltener auftreten. Ganz zu schweigen davon, dass HTML einfacher zu schreiben ist.

0
jezzipin

Die einzige Sorge, die ich mit ApiController habe, ist, dass sie standortbasiert und nicht bereichsbezogen ist. Eine Site kann nur einen apicontroller-Unterordner haben, in dem Sie Ihre Controller-Methoden benennen können. Es gibt Situationen, in denen Sie Controller möglicherweise duplizieren möchten Namen in verschiedenen Bereichen:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Ich erinnere mich daran, dass es einige benutzerdefinierte Codeeinstellungen gibt, die dazu in der Lage sind, aber es funktioniert standardmäßig nicht.

0
Ramon Chan

Ich stimme mit der Antwort von Shaun Wilson (beste Antwort) überein, weiß aber nicht warum, da ich nur etwas verwirrt bin und immer noch versuche, mit der folgenden (wahrscheinlich falschen) Vorahnung zu verstehen -

  • Verwenden Sie den WebAPI-Controller, um JSON-Daten an den Client zu übermitteln, damit der Client die Ansichtsmanipulation durchführen kann. Dieser Prozess erfordert KEINE Ansicht, sondern nur eine Antwort auf die Methode (d. H. Eine Javascript-Anforderung), sodass der Client alle clientseitigen Manipulationen ausführen kann.
  • Verwenden Sie den MVC-Controller, wenn Sie die Daten verwenden müssen, um eine Ansicht während oder unmittelbar nach page_load zu bearbeiten (d. H. Nicht für SPA-Apps).

Sie wissen, ich weiß nur nicht, wie falsch ich hier bin und bin verwirrt, weil die letzte Zeile von Shauns Antwort lautet: "Ich verwende MVC-Controller, um das grundlegende Browser-Routing und die Bereitstellung des SPA zu handhaben". - Vielleicht weiß ich nicht genau, was ein restful Client ist, wenn ich davon ausging, 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 aus der Ferne als Antwort auf meine Frage verwandt wurde. Ich beantworte diesen Beitrag, anstatt Fragen zu duplizieren.

0
R.H. Thorne