Utilizzo di WebAPI o MVC per restituire JSON in ASP.NET


138

Sto creando un'applicazione ASP.NET MVC che è pesante per gli script client, che utilizzerà JSON e jQuery per manipolare il DOM.

La mia comprensione è sia API di controllo Web e MVC controller possono tornare JSON.

Dato il mio scenario, dovrei usare un controller API Web o un controller MVC ?



1
È importante notare che questa domanda è specifica per un determinato contesto: l'autore vuole sapere quale controller usare se SOLO json dovesse essere restituito. Un'API REST consente una formattazione dei media diversa a seconda della negoziazione del contenuto (ad esempio: accetta xml, accetta json). In questo caso il controller WebAPI è l'opzione migliore
Sentinel,

Risposte:


156

I controller API Web possono essere creati e ospitati in qualsiasi applicazione ASP.NET, non solo nelle applicazioni MVC. Pertanto, un ovvio motivo per creare un'API Web è se non si dispone di un front-end MVC (ad es. Servizi Web classici e RESTful ospitati dalla propria azienda / organizzazione).

I controller MVC si basano in genere sul framework MVC, se si osservano i modelli predefiniti e la maggior parte del lavoro svolto dalla comunità e dai propri colleghi, si noterà che quasi tutti i controller MVC sono implementati tenendo presente la vista.

Personalmente, utilizzo i controller MVC quando intendo rispondere con una vista () e utilizzerò un'API Web per tutto ciò che non dipende da una vista particolare.

Ci sono avvertimenti, ovviamente, ma in generale se non si richiede il comportamento di Model Binding di MVC, il servizio è incentrato sui dati e le operazioni sono incentrate sui dati (ad es. Operazioni CRUD), quindi probabilmente si desidera un "controller API Web" "anziché un" Controller modello-vista ". Al contrario, se le tue operazioni sono View-centric (ad es. Consegna di una pagina di amministrazione utente all'utente), o hai bisogno del Model Binding di MVC per generare "ajax parziali" (molto improbabile), allora vorrai un controller MVC.

Personalmente, utilizzo i controller API Web per guidare i client RESTful basati su JSON, utilizzo i controller MVC per gestire il routing del browser di base e la consegna della SPA.


32

WebAPI serve per creare un'API. Se vuoi che qualcuno sia in grado di consumare la tua API in XML, JSON, ecc. Puoi creare un'API Web.

Nel tuo caso devi solo parlare con il cliente in JSON.

Anche se il tuo sito web è principalmente basato su script client, utilizzeresti comunque il controller MVC ASP.NET giusto? E dal momento che potresti aver già diviso logicamente i tuoi controller in base alle entità, allora ha senso aggiungere quei metodi che servono json in esso invece di creare un'altra classe specificamente per API web.

Quindi, per la tua situazione particolare (se ho capito bene), rimarrei con i controller.


Grazie, c'è una differenza nel modo in cui creiamo WebAPI vs Controller?
Nil Pun

1
@flybyte sì, devi derivare da ApiController, vedi asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammad Hasan Khan

4
Web Api può eseguire JSON, così come gli altri metodi che elenchi. I controller non possono (ordinatamente) essere trasformati in un'API, quindi dato che l'utente ha la lungimiranza di chiedere, suggerirei di utilizzare la soluzione più scalabile / flessibile. Non è come se fosse come i servizi WCF della vecchia scuola, l'API Web è generalmente potente e flessibile. Quindi, mentre hai solo bisogno di scenari semplici, tieniti alla larga. Ma hai il potere se ne hai bisogno
steve

8

La risposta si riduce alla separazione delle preoccupazioni, accelera la creazione di servizi e fa affidamento sulla convenzione piuttosto che sulla configurazione.

La responsabilità principale dei controllori è quella di lavorare come coordinatore tra vista e modello, ma dove la responsabilità principale dell'API è quella di lavorare sui dati. Nel caso delle convenzioni API, è davvero semplice eseguire operazioni CRUD. Di seguito è riportato il mapping tra operazione CRUD e azioni HTTP

  • Essere letto
  • POST: Crea
  • PUT: aggiornamento
  • ELIMINA: Elimina

Pertanto, con le API non è necessario creare azioni separate e attribuirle con azioni HTTP.


0

L'unica preoccupazione che ho con ApiController è che si basa sul sito e non sull'area. Un sito può avere solo una sottocartella apicontroller per poter assegnare un nome ai metodi del controller. Esistono situazioni in cui potresti voler duplicare il nome del controller in diverse aree:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Ricordo che ci sono alcune impostazioni di codice personalizzate per poterlo fare ma non funziona di default.


questo sembra un commento, non una risposta.
Dylan Hayes,

Non proprio quello che stai dicendo. Se si nomina un controller Area1XController, è possibile eseguire: domain.com/Area1X/1, creare un controller: Area2XController e quindi accedervi con: domain.com/Area2X/1. La grande domanda è perché vuoi farlo comunque. Il nome dell'area è astratto e non dice nulla a un utente. Se hai, diciamo, 4 aree, allora è meglio usare il nome dello scopo funzionale per esso.
Herman Van Der Blom,

0

Sono d'accordo con la risposta (risposta migliore) di Shaun Wilson, ma non so perché perché sono solo un po 'confuso e sto ancora cercando di capire con la seguente premonizione (probabilmente errata) -

  • Utilizzare il controller WebAPI per fornire i dati JSON al client in modo che il client possa gestire la manipolazione della vista. Questo processo NON richiede una vista ma piuttosto solo una risposta a qualunque cosa abbia chiamato il metodo (cioè una richiesta javascript) in modo che il client possa gestire qualsiasi manipolazione sul lato client.
  • Utilizzare il controller MVC quando è necessario utilizzare i dati per manipolare una vista durante o subito dopo page_load (ovvero non per le app SPA).

Vedete, non so come sia sbagliato qui e sono confuso perché l'ultima riga della risposta di Shaun afferma "Uso i controller MVC per gestire il routing del browser di base e la consegna della SPA". - forse non so perfettamente cosa sia un client riposante quando suppongo che potrebbe essere il metodo JavaScript a ricevere una risposta in formato JSON. questo è il post più vicino in StackOverflow che è stato collegato in remoto come risposta alla mia domanda, quindi rispondo a questo post invece di duplicare le domande.


" Usa il controller MVC per fornire la vista " puoi avvolgere la SPA in parziali MVC per la composizione in una vista. Gli sviluppatori ASP.NET MVC dovrebbero comprendere questo concetto. È possibile utilizzare le normali strutture Razor + ASP.NET durante la generazione della vista (ad es. Elaborazione lato server) per eseguire il rendering HTML + JS sul client. il problema che molti sviluppatori sperimenteranno qui è l'idea che i file HTML + JS statici non sono ciò che rende una SPA una SPA. a volte il contenuto deve essere dinamico e specifico per l'utente, ma tutti i framework tendono a sminuire questo fatto. "SPA" e "MVC" non si escludono a vicenda.
Shaun Wilson,

0

In questo scenario, consiglierei WebApi in quanto è perfetto per il trasferimento di dati come questo basato su richieste Javascript. Di solito svilupperò i miei controller WebApi in modo che restituiscano un oggetto compatibile con JSON che può quindi essere analizzato facilmente dal mio Javascript.

L'unico momento in cui vorresti usare un'azione su un controller MVC per questo genere di cose sarebbe se volessi generare un po 'di HTML e sostituire segmenti della tua pagina con chiamate Javascript.

Per esempio:

Hai un Datepicker dell'interfaccia utente di JQuery che, se selezionato, genera un elenco di pulsanti di opzione che rappresentano gli eventi nel giorno scelto.

In questo scenario, è possibile utilizzare WebApi per restituire un codice JSON e quindi generare l'HTML necessario utilizzando Javascript, ma in genere è una pratica scorretta creare molto HTML utilizzando Javascript. Sarebbe molto meglio che C # costruisse il codice HTML e poi lo restituisse tramite una vista parziale poiché in questo modo è meno probabile che si verifichino errori con l'analisi Javascript. Per non parlare del fatto che l'HTML è molto più semplice da scrivere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.