Używanie WebAPI lub MVC do zwracania JSON w ASP.NET

138

Buduję aplikację ASP.NET MVC, która jest obciążona skryptami klienta, będzie używać JSON i jQuery do manipulowania DOM.

Rozumiem, że zarówno kontroler interfejsu API sieci Web, jak i kontroler MVC mogą zwracać JSON.

Biorąc pod uwagę mój scenariusz, czy powinienem używać kontrolera internetowego interfejsu API czy kontrolera MVC ?

Nil Pun
źródło
1
Należy zauważyć, że to pytanie jest specyficzne dla określonego kontekstu: autor chce wiedzieć, jakiego kontrolera użyć, jeśli ma zostać zwrócony TYLKO json. REST API pozwala na różne formatowanie mediów w zależności od negocjacji zawartości (np. Accept xml, accept json). W takim przypadku najlepszym rozwiązaniem jest kontroler WebAPI
Sentinel

Odpowiedzi:

156

Kontrolery internetowego interfejsu API można tworzyć i hostować w dowolnej aplikacji ASP.NET, nie tylko w aplikacjach MVC. Dlatego oczywistym powodem tworzenia internetowego interfejsu API jest brak front-endu MVC (np. Klasyczne, zgodne z REST usługi internetowe hostowane przez firmę / organizację).

Kontrolery MVC zwykle opierają się na strukturze MVC, jeśli spojrzysz na domyślne szablony i większość pracy wykonanej przez społeczność i rówieśników, zauważysz, że prawie wszystkie kontrolery MVC są implementowane z myślą o widoku.

Osobiście używam kontrolerów MVC, gdy zamierzam odpowiedzieć za pomocą View (), i użyję internetowego interfejsu API do wszystkiego, co nie jest zależne od określonego widoku.

Istnieją oczywiście pewne zastrzeżenia, ale ogólnie rzecz biorąc, jeśli nie potrzebujesz zachowania powiązania modelu MVC, Twoja usługa jest zorientowana na dane, a operacje są zorientowane na dane (np. Operacje CRUD), prawdopodobnie potrzebujesz `` kontrolera internetowego interfejsu API 'zamiast' kontrolera widoku modelu '. I odwrotnie, jeśli twoje operacje są skoncentrowane na widoku (np. Dostarczanie użytkownikowi strony administratora) lub potrzebujesz powiązania modelu MVC do generowania „częściowych ajax” (bardzo mało prawdopodobne), wtedy będziesz potrzebował kontrolera MVC.

Osobiście używam kontrolerów Web API do sterowania klientami RESTful opartymi na JSON, używam kontrolerów MVC do obsługi podstawowego routingu przeglądarki i dostarczania SPA.

Shaun Wilson
źródło
32

WebAPI służy do tworzenia API. Jeśli chcesz, aby ktoś mógł korzystać z twojego API w XML, JSON itp. Możesz stworzyć webowy api.

W Twoim przypadku wystarczy rozmawiać z klientem w formacie JSON.

Nawet jeśli Twoja witryna jest w większości sterowana skryptami klienta, nadal korzystasz z kontrolera ASP.NET MVC, prawda? A ponieważ być może już logicznie podzieliłeś kontrolery na podstawie encji, sensowne jest dodanie do nich tych metod obsługi json, w przeciwieństwie do tworzenia innej klasy specjalnie dla interfejsu API sieci Web.

Więc w twojej konkretnej sytuacji (jeśli dobrze rozumiem), trzymałbym się kontrolerów.

Muhammad Hasan Khan
źródło
Dzięki, czy istnieje różnica w sposobie tworzenia interfejsu WebAPI i kontrolera?
Nil Pun
1
@flybyte tak, musisz pochodzić z ApiController, patrz asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammad Hasan Khan
4
Web Api może wykonywać JSON, a także inne wymienione przez Ciebie metody. Kontrolery nie mogą (zgrabnie) zostać przekształcone w API, więc biorąc pod uwagę, że użytkownik ma przewidywanie - sugerowałbym użycie bardziej skalowalnego / elastycznego rozwiązania. To nie jest tak, jakby to było stare usługi WCF, interfejs API sieci Web jest generalnie zarówno potężny, jak i elastyczny. Więc chociaż potrzebujesz tylko prostych scenariuszy, nie przeszkadza Ci to. Ale masz moc, gdybyś jej potrzebowała
steve
8

Odpowiedź sprowadza się do oddzielenia obaw, przyspieszenia tworzenia usług i oparcia się raczej na konwencji niż na konfiguracji.

Głównym obowiązkiem kontrolerów jest praca jako koordynator między widokiem a modelem, ale głównym obowiązkiem API jest praca na danych. W przypadku API zastosowane konwencje bardzo ułatwiają wykonywanie operacji CRUD. Poniżej znajduje się mapowanie między operacją CRUD a akcjami HTTP

  • POBIERZ: Przeczytaj
  • POST: Utwórz
  • PUT: aktualizacja
  • USUŃ: Usuń

Dzięki interfejsom API nie musisz tworzyć oddzielnych akcji i przypisywać im działań HTTP.

Kris
źródło
0

Jedynym problemem, jaki mam z ApiController, jest to, że jest oparty na witrynie, a nie na obszarze. Jedna witryna może mieć tylko jeden podfolder apicontroller, w którym można nazwać metody kontrolera. Są sytuacje, w których możesz chcieć zduplikować nazwę kontrolera w różnych obszarach:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Pamiętam, że istnieją pewne niestandardowe ustawienia kodu, aby to zrobić, ale domyślnie nie działa.

Ramon Chan
źródło
wydaje się, że to komentarz, a nie odpowiedź.
Dylan Hayes
Nie rozumiem tego, co mówisz. Jeśli nazwiesz kontroler Area1XController, możesz zrobić: domain.com/Area1X/1, utwórz kontroler: Area2XController, a następnie uzyskaj do niego dostęp za pomocą: domain.com/Area2X/1. Najważniejsze pytanie brzmi, dlaczego i tak chcesz to zrobić. Nazwa obszaru jest abstrakcyjna, nic nie mówi użytkownikowi. Jeśli masz powiedzmy 4 obszary, lepiej użyć dla niego nazwy celu funkcjonalnego.
Herman Van Der Blom
0

Zgadzam się z odpowiedzią Shauna Wilsona (najlepsza odpowiedź), ale nie wiem dlaczego, ponieważ jestem trochę zdezorientowany i wciąż próbuję zrozumieć z następującym (prawdopodobnie niepoprawnym) przeczuciem:

  • Użyj kontrolera WebAPI, aby dostarczyć dane JSON do klienta, aby klient mógł obsłużyć manipulację widokiem. Ten proces NIE wymaga widoku, ale raczej odpowiedzi zwrotnej na jakąkolwiek metodę (tj. Żądanie javascript), aby klient mógł obsłużyć dowolną manipulację po stronie klienta.
  • Użyj kontrolera MVC, gdy musisz użyć danych do manipulowania widokiem podczas lub zaraz po page_load (tj. Nie w przypadku aplikacji SPA).

Widzisz, po prostu nie wiem, dlaczego się tutaj mylę i jestem zdezorientowany, ponieważ ostatnia linijka odpowiedzi Shauna brzmi: „Używam kontrolerów MVC do obsługi podstawowego routingu przeglądarki i dostarczania SPA”. - może nie do końca wiem, czym jest spokojny klient, gdy założyłem, że może to być metoda JavaScript, która otrzymuje odpowiedź w postaci JSON. to jest najbliższy post w Stackoverflow, który był zdalnie powiązany jako odpowiedź na moje pytanie, więc odpowiadam na ten post, zamiast ewentualnie powielać pytania.

RH Thorne
źródło
Użyj kontrolera MVC do dostarczenia widoku ”, możesz opakować SPA w części MVC w celu kompozycji w widoku. Twórcy ASP.NET MVC powinni rozumieć tę koncepcję. Możesz wykorzystać zwykłe funkcje Razor + ASP.NET podczas generowania widoku (np. Przetwarzanie po stronie serwera), aby renderować HTML + JS do klienta. problemem, którego wielu deweloperów będzie tutaj doświadczać jest pomysł, że statyczne pliki HTML + JS nie sprawiają, że SPA jest SPA. czasami treść musi być dynamiczna i specyficzna dla użytkownika, ale wszystkie frameworki zwykle umniejszają ten fakt. „SPA” i „MVC” nie wykluczają się wzajemnie.
Shaun Wilson
0

W tym scenariuszu polecam WebApi, ponieważ jest idealny do przesyłania takich danych na podstawie żądań Javascript. Zwykle tworzę kontrolery WebApi tak, aby zwracały obiekt przyjazny dla formatu JSON, który można następnie łatwo przeanalizować za pomocą mojego JavaScript.

Jedynym czasem rzeczywistym, w którym chciałbyś użyć akcji na kontrolerze MVC do tego rodzaju rzeczy, byłoby wygenerowanie kodu HTML i zastąpienie segmentów strony wywołaniami JavaScript.

Na przykład:

Masz JQuery UI Datepicker, który po dokonaniu wyboru generuje listę przycisków radiowych reprezentujących wydarzenia w wybranym dniu.

W tym scenariuszu można użyć WebApi do zwrócenia części kodu JSON, a następnie wygenerowania niezbędnego kodu HTML za pomocą JavaScript, ale generalnie tworzenie dużej ilości kodu HTML przy użyciu JavaScript jest złą praktyką. Byłoby znacznie lepiej, gdyby C # utworzył kod HTML, a następnie zwrócił go za pośrednictwem częściowego widoku, ponieważ w ten sposób mniej prawdopodobne jest napotkanie błędów podczas analizowania kodu JavaScript. Nie wspominając o tym, że znacznie ułatwia pisanie HTML.

jezzipin
źródło