ASP.NET Core MVC 컨트롤러와의 요청 처리Handling requests with controllers in ASP.NET Core MVC

Steve SmithScott AddieBy Steve Smith and Scott Addie

컨트롤러, 작업 및 작업 결과 개발자가 ASP.NET Core MVC를 사용 하 여 앱을 구축 하는 방법의 핵심 부분입니다.Controllers, actions, and action results are a fundamental part of how developers build apps using ASP.NET Core MVC.

컨트롤러는 무엇입니까?What is a Controller?

컨트롤러를 정의 하 고 일련의 작업을 그룹화에 사용 됩니다.A controller is used to define and group a set of actions. 작업 (또는 동작 메서드가) 요청을 처리 하는 컨트롤러에 메서드가 만들어집니다.An action (or action method) is a method on a controller which handles requests. 컨트롤러를 논리적으로 그룹화와 유사한 동작입니다.Controllers logically group similar actions together. 이 집계 작업의 라우팅, 캐싱 및 권한 부여를 전체적으로 적용할 수 등의 규칙의 공통 집합을 허용 합니다.This aggregation of actions allows common sets of rules, such as routing, caching, and authorization, to be applied collectively. 요청을 통해 작업에 매핑된 라우팅합니다.Requests are mapped to actions through routing.

규칙에 따라 컨트롤러 클래스:By convention, controller classes:

  • 프로젝트의 루트 수준에 있는 컨트롤러 폴더Reside in the project's root-level Controllers folder
  • 상속Microsoft.AspNetCore.Mvc.ControllerInherit from Microsoft.AspNetCore.Mvc.Controller

컨트롤러는 다음 조건 중 하나 이상 true는 인스턴스화할 수 있는 클래스입니다.A controller is an instantiable class in which at least one of the following conditions is true:

  • 클래스 이름은 "Controller"로 그 뒤에The class name is suffixed with "Controller"
  • 이름이 "Controller" 접미사는 클래스에서 클래스 상속The class inherits from a class whose name is suffixed with "Controller"
  • 로 데코레이팅된 클래스는 [Controller] 특성The class is decorated with the [Controller] attribute

컨트롤러 클래스는 연결 된 있어야 [NonController] 특성입니다.A controller class must not have an associated [NonController] attribute.

컨트롤러 따라야는 명시적 종속성 원칙합니다.Controllers should follow the Explicit Dependencies Principle. 이 원칙을 구현 하는 방법은 몇 가지가 있습니다.There are a couple approaches to implementing this principle. 동일한 서비스를 필요로 하는 여러 컨트롤러 작업을 하는 경우를 사용해 생성자 삽입 해당 종속성을 요청할 수 있습니다.If multiple controller actions require the same service, consider using constructor injection to request those dependencies. 서비스가 단일 동작 메서드에서 필요한 경우 사용 하십시오 작업 삽입 종속성을 요청할 수 있습니다.If the service is needed by only a single action method, consider using Action Injection to request the dependency.

내에서 Model-V뷰-Controller 패턴은 컨트롤러에 대 한 책임이 초기 요청 처리와 모델의 인스턴스화입니다.Within the Model-View-Controller pattern, a controller is responsible for the initial processing of the request and instantiation of the model. 일반적으로 비즈니스 의사 결정 모델 내에서 수행 되어야 합니다.Generally, business decisions should be performed within the model.

컨트롤러는 모델의 처리 (있는 경우)의 결과 사용해 하 고 적절 한 보기와 관련 된 보기 데이터 또는 API 호출의 결과 반환 합니다.The controller takes the result of the model's processing (if any) and returns either the proper view and its associated view data or the result of the API call. 자세한 내용 ASP.NET Core MVC 개요ASP.NET Core MVC 및 Visual Studio 시작합니다.Learn more at Overview of ASP.NET Core MVC and Getting started with ASP.NET Core MVC and Visual Studio.

컨트롤러는는 UI 수준 추상화 합니다.The controller is a UI-level abstraction. 해당 사항이 요청 데이터가 올바른지 확인 하 고 어떤 보기 (또는 API에 대 한 결과)를 반환 해야 선택 합니다.Its responsibilities are to ensure request data is valid and to choose which view (or result for an API) should be returned. 잘 구성 된 앱에서이 포함 되지 않습니다 직접 데이터 액세스 또는 비즈니스 논리.In well-factored apps, it does not directly include data access or business logic. 대신, 컨트롤러 이러한 책임을 처리 하는 서비스에 위임 합니다.Instead, the controller delegates to services handling these responsibilities.

동작 정의Defining Actions

Public 메서드를 컨트롤러에서로 데코레이팅 된 문을 제외한는 [NonAction] 특성을 가지 작업입니다.Public methods on a controller, except those decorated with the [NonAction] attribute, are actions. 동작에 매개 변수는 데이터를 요청에 바인딩되고를 사용 하 여 모델 바인딩합니다.Parameters on actions are bound to request data and are validated using model binding. 모델 유효성 검사는 모델 바인딩 있는 모든 작업에 대해 발생 합니다.Model validation occurs for everything that's model-bound. ModelState.IsValid 속성 값을 바인딩하는 모델 및 유효성 검사의 성공 여부를 나타냅니다.The ModelState.IsValid property value indicates whether model binding and validation succeeded.

작업 메서드는 비즈니스 문제에 요청을 매핑하는 것에 대 한 논리를 포함 해야 합니다.Action methods should contain logic for mapping a request to a business concern. 비즈니스 문제나 일반적으로 컨트롤러를 통해 액세스 하는 서비스로 표시 되어야 종속성 주입합니다.Business concerns should typically be represented as services that the controller accesses through dependency injection. 작업은 비즈니스 작업의 결과 응용 프로그램 상태에 매핑됩니다.Actions then map the result of the business action to an application state.

작업, 모든 항목을 반환할 수 있지만 자주의 인스턴스를 반환 IActionResult (또는 Task<IActionResult> 비동기 메서드에 대 한) 응답을 생성 하는 합니다.Actions can return anything, but frequently return an instance of IActionResult (or Task<IActionResult> for async methods) that produces a response. 동작 메서드는 선택에 대 한 응답의 종류합니다.The action method is responsible for choosing what kind of response. 작업 결과 는 응답 하지 않는합니다.The action result does the responding.

컨트롤러 도우미 메서드Controller Helper Methods

컨트롤러에서 일반적으로 상속 컨트롤러않더라도이 필요 하지 않습니다.Controllers usually inherit from Controller, although this is not required. 파생 된 Controller 도우미 메서드의 세 가지 범주에 대 한 액세스를 제공 합니다.Deriving from Controller provides access to three categories of helper methods:

1. 빈 응답 본문에으로 인해 발생 하는 방법1. Methods resulting in an empty response body

Content-Type HTTP 응답 헤더는 응답 본문을 설명 하는 콘텐츠 없으므로 포함 되어 있습니다.No Content-Type HTTP response header is included, since the response body lacks content to describe.

이 범주 내의 결과 형식은 두 가지가: 리디렉션 및 HTTP 상태 코드입니다.There are two result types within this category: Redirect and HTTP Status Code.

  • HTTP 상태 코드HTTP Status Code

    이 형식은 HTTP 상태 코드를 반환합니다.This type returns an HTTP status code. 이러한 종류의 몇 가지 도우미 메서드는 BadRequest, NotFound, 및 Ok합니다.A couple helper methods of this type are BadRequest, NotFound, and Ok. 예를 들어 return BadRequest(); 400 상태 코드가 실행 될 때을 생성 합니다.For example, return BadRequest(); produces a 400 status code when executed. 때와 같은 메서드 BadRequest, NotFound, 및 Ok 는 오버 로드를 더 이상 자격이 HTTP 상태 코드 응답자도 콘텐츠 협상 수행 되 고 있으므로 합니다.When methods such as BadRequest, NotFound, and Ok are overloaded, they no longer qualify as HTTP Status Code responders, since content negotiation is taking place.

  • 리디렉션Redirect

    이 이와 같은 작업이 나 대상에 리디렉션이 반환 (사용 하 여 Redirect, LocalRedirect, RedirectToAction, 또는 RedirectToRoute).This type returns a redirect to an action or destination (using Redirect, LocalRedirect, RedirectToAction, or RedirectToRoute). 예를 들어 return RedirectToAction("Complete", new {id = 123}); 리디렉션합니다 Complete, 익명 개체를 전달 합니다.For example, return RedirectToAction("Complete", new {id = 123}); redirects to Complete, passing an anonymous object.

    리디렉션 결과 형식이 주로 추가 HTTP 상태 코드 형식에서 다른 한 Location HTTP 응답 헤더입니다.The Redirect result type differs from the HTTP Status Code type primarily in the addition of a Location HTTP response header.

2. 미리 정의 된 콘텐츠 형식과 비어 있지 않은 응답 본문에으로 인해 발생 하는 방법2. Methods resulting in a non-empty response body with a predefined content type

이 항목의 대부분의 도우미 메서드를 포함 한 ContentType 속성을 설정할 수는 Content-Type 응답 본문을 설명 하기 위해 응답 헤더입니다.Most helper methods in this category include a ContentType property, allowing you to set the Content-Type response header to describe the response body.

이 범주 내의 결과 형식은 두 가지가: 보기서식이 지정 된 응답합니다.There are two result types within this category: View and Formatted Response.

  • 보기View

    이 형식은 HTML을 렌더링 하는 모델을 사용 하는 뷰를 반환 합니다.This type returns a view which uses a model to render HTML. 예를 들어 return View(customer); 보기에 데이터 바인딩 모델을 전달 합니다.For example, return View(customer); passes a model to the view for data-binding.

  • 서식이 지정 된 응답Formatted Response

    이 형식은 JSON 또는 비슷한 데이터 교환 형식인 개체를 나타내는 지정 된 방식으로 반환 합니다.This type returns JSON or a similar data exchange format to represent an object in a specific manner. 예를 들어 return Json(customer); JSON 형식에 제공된 된 개체를 serialize 합니다.For example, return Json(customer); serializes the provided object into JSON format.

    이 형식의 다른 일반적인 방법 File, PhysicalFile, 및 VirtualFile합니다.Other common methods of this type include File, PhysicalFile, and VirtualFile. 예를 들어 return PhysicalFile(customerFilePath, "text/xml"); 에서 설명 하는 XML 파일을 반환 합니다.는 Content-Type 응답 헤더 값에 "text/xml"입니다.For example, return PhysicalFile(customerFilePath, "text/xml"); returns an XML file described by a Content-Type response header value of "text/xml".

3. 클라이언트와 협상 콘텐츠 형식으로 서식이 지정 된 비어 있지 않은 응답 본문에으로 인해 발생 하는 방법3. Methods resulting in a non-empty response body formatted in a content type negotiated with the client

이 범주는 더 잘 알려져 콘텐츠 협상합니다.This category is better known as Content Negotiation. 콘텐츠 협상 동작 반환 될 때마다 적용 되는 ObjectResult 형식 또는 이외의 이와 IActionResult 구현 합니다.Content negotiation applies whenever an action returns an ObjectResult type or something other than an IActionResult implementation. 비-반환 하는 동작IActionResult 구현 (예를 들어 object)도 서식이 지정 된 응답을 반환 합니다.An action that returns a non-IActionResult implementation (for example, object) also returns a Formatted Response.

이러한 종류의 일부 도우미 메서드를 포함 BadRequest, CreatedAtRoute, 및 Ok합니다.Some helper methods of this type include BadRequest, CreatedAtRoute, and Ok. 이러한 방법의 예로 return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject);, 및 return Ok(value);각각.Examples of these methods include return BadRequest(modelState);, return CreatedAtRoute("routename", values, newobject);, and return Ok(value);, respectively. BadRequestOk 값으로 전달 하는 경우에 콘텐츠 협상을 수행 합니다; 값을 전달 하지 않고 대신으로 사용 HTTP 상태 코드의 결과 형식입니다.Note that BadRequest and Ok perform content negotiation only when passed a value; without being passed a value, they instead serve as HTTP Status Code result types. CreatedAtRoute 메서드, 반면에 항상 콘텐츠 협상을 수행 이후의 메서드의 오버 로드 된 값을 전달할 수 모두 필요 합니다.The CreatedAtRoute method, on the other hand, always performs content negotiation since its overloads all require that a value be passed.

일반적인 문제Cross-Cutting Concerns

일반적으로 응용 프로그램의 워크플로 부분을 공유합니다.Applications typically share parts of their workflow. 쇼핑 카트를 액세스할 때 인증을 요구 하는 응용 프로그램 또는 일부 페이지에 데이터를 캐시 하는 응용 프로그램을 예로 들 수 있습니다.Examples include an app that requires authentication to access the shopping cart, or an app that caches data on some pages. 를 앞 이나 뒤 동작 메서드의 논리를 수행 하려면 사용 하 여 한 필터합니다.To perform logic before or after an action method, use a filter. 사용 하 여 필터 일반적인 문제에 따라 수 있으므로 중복 줄일 수는 하지 반복 직접 (드라이) 원칙합니다.Using Filters on cross-cutting concerns can reduce duplication, allowing them to follow the Don't Repeat Yourself (DRY) principle.

필터 가장와 같은 특성을 [Authorize], 원하는 수준의 세분성에 따라 컨트롤러 또는 동작 수준에 적용할 수 있습니다.Most filter attributes, such as [Authorize], can be applied at the controller or action level depending upon the desired level of granularity.

오류 처리 및 응답 캐시는 종종 일반적인 문제:Error handling and response caching are often cross-cutting concerns:

필터 또는 사용자 지정을 사용 하 여 많은 일반적인 문제를 처리할 수 있습니다 미들웨어합니다.Many cross-cutting concerns can be handled using filters or custom middleware.