WebAPI 또는 MVC를 사용하여 ASP.NET에서 JSON 반환


138

클라이언트 스크립트가 많은 ASP.NET MVC 응용 프로그램을 작성 중입니다 .JSON과 jQuery를 사용하여 DOM을 조작합니다.

내 이해는 Web API ControllerMVC Controller 가 JSON을 반환 할 수 있다는 것입니다.

내 시나리오가 주어지면 Web API Controller 또는 MVC Controller를 사용해야 합니까?



1
주목할 점은이 질문은 특정 상황에만 해당된다는 것입니다. 저자는 json 만 반환해야하는 경우 사용할 컨트롤러를 알고 싶어합니다. REST API는 컨텐츠 협상에 따라 다른 매체 형식을 허용합니다 (예 : accept xml, accept json). 이 경우 WebAPI 컨트롤러가 최선의 선택입니다.
Sentinel

답변:


156

웹 API 컨트롤러는 MVC 응용 프로그램뿐만 아니라 모든 ASP.NET 응용 프로그램에서 만들고 호스팅 할 수 있습니다. 따라서 웹 API를 작성해야하는 분명한 이유는 MVC 프런트 엔드가없는 경우입니다 (예 : 회사 / 조직에서 호스팅하는 고전적이고 RESTful 웹 서비스).

MVC 컨트롤러는 일반적으로 MVC 프레임 워크에 의존합니다. 기본 템플릿과 커뮤니티 및 동료가 수행하는 대부분의 작업을 보면 거의 모든 MVC 컨트롤러가 View를 염두에두고 구현되어 있음을 알 수 있습니다.

개인적으로 View ()로 응답하려고 할 때 MVC 컨트롤러를 사용하며 특정 뷰에 의존하지 않는 모든 것에 웹 API를 사용합니다.

물론 경고가 있지만 일반적으로 MVC의 모델 바인딩 동작이 필요하지 않고 서비스는 데이터 중심이며 작업은 데이터 중심 (예 : CRUD 작업) 인 경우 '웹 API 컨트롤러 '모델-뷰 컨트롤러'대신 ' 반대로, 작업이 뷰 중심 (예 : 사용자 관리 페이지를 사용자에게 전달)이거나 'ajax partials'를 생성하기 위해 MVC의 모델 바인딩이 필요한 경우 (아마도) MVC 컨트롤러가 필요합니다.

개인적으로 JSON 기반 RESTful 클라이언트를 구동하기 위해 웹 API 컨트롤러를 사용하고 기본 브라우저 라우팅 및 SPA 전달을 처리하기 위해 MVC 컨트롤러를 사용합니다.


32

WebAPI는 API를 만들기위한 것입니다. 누군가가 API를 XML, JSON 등으로 사용할 수있게하려면 웹 API를 만들 수 있습니다.

귀하의 경우 JSON으로 만 클라이언트와 대화하면됩니다.

웹 사이트가 주로 클라이언트 스크립트 중심이지만 ASP.NET MVC Controller를 계속 사용하고 있습니까? 그리고 엔티티를 기반으로 컨트롤러를 이미 논리적으로 분할했을 수도 있으므로 웹 API 전용으로 다른 클래스를 만드는 것과는 대조적으로 해당 json 제공 메소드를 추가하는 것이 좋습니다.

따라서 귀하의 특정 상황 (내가 올바르게 이해한다면), 나는 컨트롤러를 고수 할 것입니다.


감사합니다. WebAPI와 Controller를 만드는 방법에 차이가 있습니까?
Nil Pun

1
@flybyte 예는 ApiController에서 파생 할 필요가 참조 asp.net/web-api/overview/getting-started-with-aspnet-web-api/...
무하마드 하산 칸

4
웹 API는 JSON뿐만 아니라 나열한 다른 방법을 수행 할 수 있습니다. 컨트롤러는 (정확하게) API로 전환 할 수 없으므로 사용자에게 물어볼 수있는 통찰력이 있다면 더 확장 가능하고 유연한 솔루션을 사용하는 것이 좋습니다. 구식 WCF 서비스처럼 웹 API는 일반적으로 강력하고 유연합니다. 따라서 간단한 시나리오 만 있으면되지만 방해가되지 않습니다. 그러나 당신은 당신이 그것을 필요로하는 힘을 가지고있다
steve

8

그에 대한 해답은 우려 사항 분리, 서비스 생성 속도 단축, 구성보다는 컨벤션에 의존합니다.

컨트롤러의 주요 책임은 뷰와 모델 간의 조정자 역할을하는 것이지만 API의 주요 책임은 데이터 작업입니다. API 규칙의 경우 CRUD 작업을 정말 쉽게 수행 할 수 있습니다. 아래는 CRUD 작업과 HTTP 작업 간의 매핑입니다.

  • GET : 읽기
  • POST : 작성
  • PUT : 업데이트
  • 삭제 : 삭제

따라서 API를 사용하면 별도의 조치를 작성하고 HTTP 조치로 속성을 지정할 필요가 없습니다.


0

ApiController와 관련된 유일한 관심사는 영역 기반이 아니라 사이트 기반이라는 것입니다. 하나의 사이트에는 컨트롤러 메서드의 이름을 지정할 수있는 하나의 apicontroller 하위 폴더 만있을 수 있습니다. 다른 영역에서 컨트롤러 이름을 복제하려는 경우가 있습니다.

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

이 작업을 수행 할 수있는 사용자 정의 코드 설정이 있지만 기본적으로 작동하지 않는다는 것을 기억합니다.


이것은 답변이 아닌 의견처럼 보입니다.
Dylan Hayes

당신이 말하는 것을 정말로하지 마십시오. 컨트롤러의 이름을 Area1XController로 지정하면 domain.com/Area1X/1 컨트롤러를 작성하고 Area2XController 컨트롤러를 작성한 다음 domain.com/Area2X/1로 액세스 할 수 있습니다. 중요한 질문은 어쨌든 그렇게하고 싶은 이유입니다. 지역 이름은 추상적이며 사용자에게 아무 것도 말하지 않습니다. 4 개 영역이라고하면 기능 목적 이름을 사용하는 것이 좋습니다.
허먼 반 데르 블롬

0

나는 숀 윌슨 (상단 답변)의 답변에 동의하지만 왜 약간 혼란스럽고 여전히 다음과 같은 (아마도 잘못된) 예견을 이해하려고 노력하는지 확실하지 않습니다.

  • 클라이언트가 뷰 조작을 처리 할 수 ​​있도록 WebAPI Controller를 사용하여 JSON 데이터를 클라이언트에 전달하십시오. 이 프로세스는 뷰가 필요하지 않고 클라이언트가 클라이언트 측 조작을 처리 할 수 ​​있도록 메소드 (예 : 자바 스크립트 요청)에 대한 응답 만 요구합니다.
  • page_load 중 또는 직후 (예 : SPA 앱이 아님) 데이터를 사용하여보기를 조작해야하는 경우 MVC 컨트롤러를 사용하십시오.

Shaun의 답변의 마지막 줄에 "기본 브라우저 라우팅 및 SPA 전달을 처리하기 위해 MVC 컨트롤러를 사용하고 있기 때문에"내가 여기에서 어떻게 틀 렸으며 혼란스러워하는지 알 수 있습니다. -아마도 JSON 형식으로 응답을받는 JavaScript 메소드 일 수 있다고 가정했을 때 편안한 클라이언트가 무엇인지 완전히 알지 못합니다. 이것은 Stackoverflow에서 가장 가까운 게시물이며 내 질문에 대한 답변과 원격으로 관련되어 있으므로 질문을 복제하는 대신이 게시물에 답변하고 있습니다.


" MVC 컨트롤러를 사용하여보기 제공 "SPA를 MVC 부분으로 랩하여 구성 할 수 있습니다. ASP.NET MVC 개발자는이 개념을 이해해야합니다. 뷰 생성 (예 : 서버 측 처리) 중에 일반 Razor + ASP.NET 기능을 사용하여 HTML + JS를 클라이언트에 렌더링 할 수 있습니다. 많은 개발자들이 여기서 경험하게 될 문제는 정적 HTML + JS 파일이 SPA 를 SPA로 만드는 것이 아니라는 생각 입니다. 때로는 콘텐츠가 동적이어야 하고 사용자에게 고유해야하지만 모든 프레임 워크가이 사실을 방해하는 경향이 있습니다. "SPA"및 "MVC"는 상호 배타적이지 않습니다.
Shaun Wilson

0

이 시나리오에서는 Javascript 요청을 기반으로 이와 같은 데이터를 전송하기에 완벽한 WebApi를 권장합니다. 나는 일반적으로 WebApi 컨트롤러를 개발하여 JSON 친화적 인 객체를 반환하고 Javascript로 쉽게 구문 분석 할 수 있습니다.

이런 종류의 작업을 위해 MVC 컨트롤러에서 작업을 사용하려는 유일한 실시간은 HTML을 생성하고 페이지 세그먼트를 Javascript 호출로 바꾸려는 경우입니다.

예를 들면 다음과 같습니다.

선택시 선택한 요일의 이벤트를 나타내는 단일 선택 단추를 생성하는 JQuery UI Datepicker가 있습니다.

이 시나리오에서는 WebApi를 사용하여 일부 JSON을 리턴 한 다음 Javascript를 사용하여 필요한 HTML을 생성 할 수 있지만 일반적으로 Javascript를 사용하여 많은 HTML을 작성하는 것은 좋지 않습니다. C #에서 HTML을 빌드 한 다음 부분보기를 통해 HTML을 반환하는 것이 훨씬 좋습니다. 이런 방식으로 Javascript 구문 분석에서 오류가 발생할 가능성이 줄어 듭니다. 말할 것도없이 HTML을 훨씬 쉽게 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.