ASP.NET MVC에서 ApiController와 Controller의 차이점


343

나는 ASP.NET MVC 4 베타와 함께 놀아 봤는데 컨트롤러 두 가지 유형의 지금 참조 : ApiControllerController .

특정 컨트롤러를 선택할 수있는 상황에 대해서는 약간 혼란 스럽습니다.

예를 들어보기를 반환하려면 다음을 사용 ApiController하거나 일반Controller 합니까? WCF 웹 API가 MVC와 통합되었다는 것을 알고 있습니다.

이제 우리는 두 컨트롤러를 모두 사용할 수 있으므로 누군가가 해당 컨트롤러에 어떤 상황을 가야하는지 지적 할 수 있습니다.


23
중요 : ASPNET 핵심은 '통합'했다 ApiControllerController그래서 당신이 사용하는 경우 새로운 .NET 더 이상 ApiController에 대해 걱정할 필요가 없습니다 - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api
Simon_Weaver

2
그들이 기뻐요! 나는 방식에 의해이 긴 다시 예측 prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi
VJAI

답변:


356

Controller를 사용하여 일반 뷰를 렌더링하십시오. ApiController 작업은 직렬화되어 클라이언트로 전송 된 데이터 만 반환합니다.

여기 링크가 있습니다

인용문:

참고 ASP.NET MVC로 작업 한 경우 이미 컨트롤러에 익숙합니다. 웹 API에서도 비슷하게 작동하지만 웹 API의 컨트롤러는 Controller 클래스 대신 ApiController 클래스에서 파생됩니다. 가장 먼저 눈에 띄는 차이점은 웹 API 컨트롤러의 작업은 뷰를 반환하지 않고 데이터를 반환한다는 것입니다.

ApiController는 데이터 반환에 특화되어 있습니다. 예를 들어, 클라이언트가 요청한 형식으로 데이터를 투명하게 직렬화합니다. 또한 기본적으로 다른 라우팅 체계를 따릅니다 (URL을 동작에 매핑). 규칙에 따라 REST-ful API를 제공합니다.

some (?) 수동 코딩으로 ApiController 대신 Controller를 사용하여 무엇이든 할 수 있습니다. 결국 두 컨트롤러 모두 ASP.NET 기반을 기반으로합니다. 그러나 REST-ful API를 갖는 것은 오늘날 이러한 API의 구현을 단순화하기 위해 WebAPI를 작성해야하는 일반적인 요구 사항입니다.

HTML 기반 웹 / 인터넷 / 인트라넷 응용 프로그램을 작성하는 경우-때때로 AJAX 호출이 json을 반환하는 경우-MVC / 컨트롤러를 사용하십시오. 시스템에 데이터 기반 / REST-ful 인터페이스를 제공하려면 WebAPI를 사용하십시오. 물론 MVC 페이지에서 ApiController가 AJAX 호출을 제공하도록 둘 다 결합 할 수 있습니다.

실제 사례를 제시하기 위해 : 현재 엔티티에 REST-ful API를 제공하는 ERP 시스템을 사용하고 있습니다. 이 API의 경우 WebAPI가 좋은 후보입니다. 동시에 ERP 시스템은 REST-ful API에 대한 쿼리를 작성하는 데 사용할 수있는 AJAX 인증 웹 애플리케이션을 제공합니다. 웹 응용 프로그램 자체는 MVC 응용 프로그램으로 구현되어 WebAPI를 사용하여 메타 데이터 등을 가져올 수 있습니다.


9
참고 : 데이터가 유선으로 전송되므로 어떻게 형식화됩니까? ApiController가 반환하는 데이터의 형식은 컨텐츠 협상 및 GlobalConfiguration.Configuration.Formatters ... 링크에 의해 결정됩니다. 링크 : blogs.msdn.com/b/kiranchalla/archive/2012/02/25/…
Tim Lovell-Smith

1
웹 API가 웹 사이트, 모바일 등을위한 공통 플랫폼이라고 말하는 것이 맞습니까? Web API 대신 Class Library를 사용할 수 있습니까?
Imad Alazani

Andre는 질문에 대답하지 않기 때문에 @ TimLovell-Smith에게 감사드립니다. Controller는 데이터를 반환 할 수 있기 때문에 ApiController가 존재하고 유용한 이유를 설명하지 않습니다.
JYL

2
@JYL 더 자세한 정보를 제공하기 위해 답변을 보강했습니다.
Andre Loker

2
"컨벤션에 따라 REST-ful API 제공" 이라고 말했을 때 나는 정말로 이해하지 못했습니다 . REST-ful API를 어떻게 제공합니까? API에서 반환하는 데이터에 의존하지 않습니까? 컨트롤러에 API가 REST-ful이되도록 강제하는 (또는 심지어 촉진하는) 것은 없습니다.
Nawaz

192

어느 쪽을 작성하고 유지 하시겠습니까?

ASP.NET MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

ASP.NET 웹 API

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

6
좋은 지적이지만 ApiController는 단순한 JSON 직렬화 이상입니다. 또한 요청을보고 승인 유형 인 경우 XML을 리턴합니다.
Jake Almer

10
asp.net 코어를 사용하면 모든 Controller클래스 에서 파생됩니다 .
Tân

2
이것은 오래된 예처럼 보입니다. 이제 우리는 ApiController단지 : Controller작품 에 대해 걱정할 필요가 없습니다. 새로운 닷넷 코어 컨트롤러 예제도 추가 할 수 있습니까
Ashish Kamble

@AshishKamble, ApiController 대신 ControllerBase가 사용됩니다.
블라디미르 Shiyanov

솔직히, 나는 오히려 Json()버전을 갖고 싶습니다 . 더 명확하고 명시 적입니다. 코드가 요청에 어떻게 응답하는지 알아내는 데 많은 마술이 마음에 들지 않습니다.
Jez

27

ASP.NET Core의 MVC6은 종종 두 세계를 모두 지원해야하기 때문에 두 패턴을 하나로 병합했다는 사실을 좋아합니다. 당신이 표준 MVC 조정할 수 있다는 것을 사실이지만 Controller(그리고 / 또는 당신의 자신의 개발 ActionResult클래스)의 역할 및 단지처럼 행동하는 ApiController데, 그 위에 : 그것을 유지하고 시험을하기가 매우 어려울 수 있습니다 컨트롤러 , 리턴 할 방법을 ActionResult다른 사람들과 혼합 원시 / 직렬화 /IHttpActionResult 데이터를 하는 것은 개발자의 관점에서 볼 때 혼동 될 수 있습니다. 혼자서 작업하지 않고 다른 개발자가 해당 하이브리드 방식으로 빠르게 진행해야하는 경우에는 더욱 그렇습니다.

지금까지 ASP.NET 비 핵심 웹 응용 프로그램에서이 문제를 최소화하기 위해 얻은 최고의 기술은 웹 API 패키지를 MVC 기반 웹 응용 프로그램으로 가져 와서 올바르게 구성하는 것입니다. 세계 : Controllers뷰, ApiControllers데이터

그렇게하려면 다음을 수행해야합니다.

  • NuGet : Microsoft.AspNet.WebApi.Core및을 사용하여 다음 웹 API 패키지를 설치하십시오 Microsoft.AspNet.WebApi.WebHost.
  • 하나 이상의 ApiController를 /Controllers/ 폴더에 .
  • 다음 WebApiConfig.cs 파일을 /App_Config/폴더에 추가하십시오 .

using System.Web.Http;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

마지막으로 위의 클래스를 Startup 클래스 에 등록해야합니다 ( Startup.cs또는Global.asax.cs 당신이 OWIN 시작 템플릿을 사용하거나하지 않는 경우, 따라).

Startup.cs

 public void Configuration(IAppBuilder app)
 {
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    ConfigureAuth(app);
    // ...
}

Global.asax.cs

protected void Application_Start()
{
    // Register Web API routing support before anything else
    GlobalConfiguration.Configure(WebApiConfig.Register);

    // The rest of your file goes there
    // ...
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    // ...
}

이 접근법은 장단점과 함께 내 블로그에 작성한 이 게시물에 자세히 설명되어 있습니다.


1
좋은 것. 그러나이 기능은 이미 vs2015에 내장되어 있습니다. webapi asp.net 프로젝트를 생성하면 모든 보일러 플레이트 코드를 자동으로 수행합니다.
suomi-dev

@Darkseal "관리 및 테스트하기가 매우 어려울 수 있습니다"에 대해 좀 더 자세히 설명해 주시겠습니까? (귀하의 블로그 게시물을 읽었습니다) WebAPI2를 사용했으며 작동 방식이 마음에 듭니다. 그러나 나는 "일을하는 일반적인 방법"을 갖는 것 외에 "실제 큰 이점"을 알 수 없습니다. "수동으로"직렬화 된 문자열을 반환하는 클래식 MVC 컨트롤러를 사용하는 것은 매우 쉽습니다. http Accept 동사로 json / xml 스위치를 추가하는 데 많은 시간이 걸리지 않습니다. 좋은 유틸리티 방법으로 감쌀 수있는 모든 것. 감사합니다.
ValGe

2
@ValGe, 위의 @ manish-jain 답변을 참조하십시오. 간단히 말해서, ControllerJson 직렬화 된 문자열을 래핑하는 ActionResult것은 항목 ApiController목록을 직접 반환하도록 설정하는 것보다 테스트 및 관리하기가 확실히 어렵습니다 [Serializable]. 매번 수동으로 직렬화를 해제 할 필요가 없기 때문에 모든 테스트 방법을 작성하기가 훨씬 쉬울 것입니다. ASP.NET 또는 다른 프레임 워크를 사용하는 거의 모든 시스템 통합 작업에 대해서도 마찬가지입니다. Controllers훌륭하지만 ApiControllers, 적어도 .NET Framework 4.x에서 RESTful 작업에 더 적합
Darkseal

1

Web API의 모든 메소드는 직렬화없이 데이터 (JSON)를 리턴합니다.

그러나 MVC 컨트롤러에서 JSON 데이터를 리턴하기 위해 리턴 된 조치 결과 유형을 JsonResult로 설정하고 오브젝트에서 Json 메소드를 호출하여 JSON으로 패키지되도록합니다.


1

주요 차이점은 다음과 같습니다. 웹 API는 모든 클라이언트, 모든 장치에 대한 서비스이며 MVC 컨트롤러는 해당 클라이언트에만 서비스를 제공합니다. MVC 플랫폼이기 때문에 동일합니다.


-1

HTML 기반 웹 / 인터넷 / 인트라넷 응용 프로그램을 작성하는 경우-때때로 AJAX 호출이 json을 반환하는 경우-MVC / 컨트롤러를 사용하십시오. 시스템에 데이터 기반 / REST-ful 인터페이스를 제공하려면 WebAPI를 사용하십시오. 물론 MVC 페이지에서 ApiController가 AJAX 호출을 제공하도록 둘 다 결합 할 수 있습니다. 기본적으로 컨트롤러는 mvc에 사용되며 API 컨트롤러는 Rest- API에 사용되며 필요에 따라 동일한 프로그램에서 둘 다 사용할 수 있습니다

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