ASP.NET Core는 ASP.NET 4.x의 MVC 및 Web API 앱 모델을 ASP.NET Core MVC라는 단일 프로그래밍 모델로 결합합니다.
이 문서에서는 'ASP.NET Web API 2 시작하기'에서 만든 제품 컨트롤러를 ASP.NET Core로 마이그레이션하는 방법을 설명합니다.
필수 조건
- ASP.NET 및 웹 개발 워크로드가 있는 Visual Studio 2022.
- .NET 6 SDK
새 ASP.NET Core Web API 프로젝트 만들기
- 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.
- 검색 상자에 Web API를 입력합니다.
- ASP.NET Core Web API 템플릿을 선택하고 다음을 선택합니다.
- 새 프로젝트 구성 대화 상자에서 프로젝트 이름을 ProductsCore 로 지정하고 다음을 선택합니다.
-
추가 정보 대화 상자에서:
- 확인하십시오 Framework이 .NET 6.0 (장기 지원)입니다.
- 컨트롤러 사용(최소 API를 사용하려면 선택 취소) 확인란을 선택합니다.
- 에서 OpenAPI 지원선택을 취소합니다.
- 선택하고생성합니다.
WeatherForecast 템플릿 파일 제거
- 새
WeatherForecast.cs
프로젝트에서Controllers/WeatherForecastController.cs
및 예제 파일을 제거합니다. - 에서속성\launchSettings.js을 엽니다.
-
launchUrl
속성을weatherforcast
에서productscore
로 변경합니다.
ASP.NET Core Web API에 대한 구성
ASP.NET Core는 App_Start 폴더 또는 Global.asax 파일을 사용하지 않습니다. web.config 파일은 게시 시간에 추가됩니다. 자세한 내용은 web.config 파일참조하세요.
Program.cs
파일:
- Global.asax대체합니다.
- 모든 앱 시작 작업을 처리합니다.
자세한 내용은 ASP.NET Core에서 앱 시작을 참조하세요.
다음은 ASP.NET Core Program.cs
파일의 애플리케이션 시작 코드를 보여줍니다.
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
제품 모델 복사
- 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 추가>새 폴더를 선택합니다. 폴더 이름을 Models로 지정합니다.
- Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 제품 클래스의 이름을 지정하고 추가를 선택합니다.
- 템플릿 모델 코드를 다음으로 바꿉다.
namespace ProductsCore.Models
{
public class Product
{
public int Id { get; set; }
public string? Name { get; set; }
public string? Category { get; set; }
public decimal Price { get; set; }
}
}
위의 강조 표시된 코드는 다음을 변경합니다.
-
?
및Name
속성을 nullable 참조 형식으로 선언하기 위해Category
주석이 추가되었습니다.
ASP.NET Core는 C# 8 도입된Nullable 기능을 활용하여 참조 형식 처리에 추가 코드 흐름 분석 및 컴파일 시간 보안을 제공할 수 있습니다. 예를 들어 null
참조 예외로부터 보호합니다.
이 경우 Name
및 Category
nullable 형식일 수 있습니다.
.NET 6 프로젝트의 ASP.NET Core는 기본적으로 nullable 참조 형식을 사용하도록 설정합니다. 자세한 내용은 Nullable 참조 형식참조하십시오.
ProductsController를 복사
- 컨트롤러 폴더를 마우스 오른쪽 단추로 클릭합니다.
- > 컨트롤러 추가...선택합니다.
- 새 스캐폴드된 항목 추가 대화 상자에서 MVC 컨트롤러 - 빈을 선택한 다음 추가를 선택합니다.
- 컨트롤러를 이름을 ProductsController 로 설정하고 추가를 선택합니다.
- 템플릿 컨트롤러 코드를 다음으로 바꿉니다.
using Microsoft.AspNetCore.Mvc;
using ProductsCore.Models;
namespace ProductsCore.Controllers;
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
Product[] products = new Product[]
{
new Product
{
Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
},
new Product
{
Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
},
new Product
{
Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
}
};
[HttpGet]
public IEnumerable<Product> GetAllProducts()
{
return products;
}
[HttpGet("{id}")]
public ActionResult<Product> GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return product;
}
}
위의 강조 표시된 코드는 다음을 변경하여 ASP.NET Core로 마이그레이션합니다.
ASP.NET Core에 없는 다음 ASP.NET 4.x 구성 요소에 대한 using 문을 제거합니다.
-
ApiController
클래스 -
System.Web.Http
네임스페이스 -
IHttpActionResult
인터페이스
-
using ProductsApp.Models;
문장을using ProductsCore.Models;
으로 변경합니다.루트 네임스페이스를
ProductsCore
설정합니다.ApiController
을/를 ControllerBase으로 변경합니다.using Microsoft.AspNetCore.Mvc;
을 추가하여ControllerBase
참조를 해결합니다.GetProduct
작업의 반환 형식을IHttpActionResult
ActionResult<Product>
변경합니다. 자세한 내용은 Controller 작업 반환 형식참조하세요.GetProduct
작업의return
문을 다음 문으로 간소화합니다.return product;
다음 섹션에서 설명하는 다음 특성을 추가합니다.
[Route("api/[controller]")]
[ApiController]
[HttpGet]
[HttpGet("{id}")]
라우팅
ASP.NET Core는 엔드포인트 라우팅 미들웨어가 전체 미들웨어 파이프라인을 래핑하는 최소한의 호스팅 모델을 제공하므로 경로를 등록하기 위해 WebApplication 또는 UseEndpoints 명시적으로 호출하지 않고도 경로를 UseRouting 직접 추가할 수 있습니다.
UseRouting
경로 일치가 발생하는 위치를 지정하는 데 계속 사용할 수 있지만, 미들웨어 파이프라인의 시작 부분에서 경로를 일치시켜야 하는 경우 UseRouting
명시적으로 호출할 필요는 없습니다.
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
WebApplication 경로는 파이프라인의 끝 실행됩니다.
마이그레이션된 ProductsController
라우팅
마이그레이션된 ProductsController
다음과 같이 강조 표시된 특성을 포함합니다.
using Microsoft.AspNetCore.Mvc;
using ProductsCore.Models;
namespace ProductsCore.Controllers;
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
Product[] products = new Product[]
{
new Product
{
Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
},
new Product
{
Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
},
new Product
{
Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
}
};
[HttpGet]
public IEnumerable<Product> GetAllProducts()
{
return products;
}
[HttpGet("{id}")]
public ActionResult<Product> GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return product;
}
}
[Route]
특성 컨트롤러의 특성 라우팅 패턴을 구성합니다.[ApiController]
특성은 특성 라우팅을 이 컨트롤러의 모든 작업에 대한 요구 사항으로 만듭니다.[action]
지원합니다. 런타임 시 각 토큰은 각각 특성이 적용된 컨트롤러 또는 작업의 이름으로 바뀝니다. 토큰:- 경로에 하드 코딩된 문자열을 사용할 필요를 줄이거나 제거합니다.
- 자동 이름 바꾸기 리팩터링이 적용될 때 경로가 해당 컨트롤러 및 작업과 동기화된 상태로 유지되는지 확인합니다.
HTTP 가져오기 요청은 다음 특성을 사용하여
ProductController
작업에 대해 사용하도록 설정됩니다.-
[HttpGet]
특성이GetAllProducts
작업에 적용되었습니다. -
[HttpGet("{id}")]
특성이GetProduct
작업에 적용되었습니다.
-
마이그레이션된 프로젝트를 실행하고 /api/products
찾습니다. 예: https://localhost:<port>
/api/products. 세 가지 제품의 전체 목록이 나타납니다.
/api/products/1
로 이동합니다. 첫 번째 제품이 나타납니다.
추가 리소스
- ASP.NET Core로 웹 API 만들기
- ASP.NET Core 웹 API의 컨트롤러 작업 반환 형식
- ASP.NET Core MVC 대한 호환성 버전
이 문서에서는 ASP.NET 4.x Web API에서 ASP.NET Core MVC로 마이그레이션하는 데 필요한 단계를 보여 줍니다.
필수 조건
- ASP.NET 및 웹 개발 워크로드를 사용한 Visual Studio 2019 16.4 이상
- .NET Core 3.1 SDK
ASP.NET 4.x Web API 프로젝트 검토
이 문서에서는 ASP.NET Web API 2 시작하기에서 만든 ProductsApp 프로젝트를 사용합니다. 이 프로젝트에서 기본 ASP.NET 4.x Web API 프로젝트는 다음과 같이 구성됩니다.
Global.asax.cs
에서 WebApiConfig.Register
로 호출됩니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace ProductsApp
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}
WebApiConfig
클래스는 App_Start 폴더에 있으며 정적 Register
메서드가 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace ProductsApp
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
이전 클래스:
- 실제로 사용되지는 않지만 특성 라우팅구성합니다.
- 라우팅 테이블을 구성합니다.
샘플 코드에서는 URL이
/api/{controller}/{id}
형식과 일치해야 하며{id}
선택 사항입니다.
다음 섹션에서는 Web API 프로젝트를 ASP.NET Core MVC로 마이그레이션하는 방법을 보여 줍니다.
대상 프로젝트 만들기
Visual Studio에서 새 빈 솔루션을 만들고 마이그레이션할 ASP.NET 4.x Web API 프로젝트를 추가합니다.
- 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.
- 빈 솔루션 템플릿을 선택하고 다음을 선택합니다.
- 솔루션 이름을 으로 지정하고, WebAPIMigration로 설정합니다. 선택하고생성합니다.
- 기존 ProductsApp 프로젝트를 솔루션에 추가합니다.
마이그레이션할 새 API 프로젝트를 다음으로 추가합니다.
- 솔루션에 새 ASP.NET Core Web Application 프로젝트를 추가합니다.
- 새 프로젝트 구성 대화 상자에서 프로젝트 이름을 ProductsCore 이름을 지정하고 만들기선택합니다.
- 새 ASP.NET Core 웹 애플리케이션 만들기 대화 상자에서 .NET Core 및 ASP.NET Core 3.1 선택되어 있는지 확인합니다. API 프로젝트 템플릿을 선택하고 만들기를 선택합니다.
- 새
WeatherForecast.cs
프로젝트에서Controllers/WeatherForecastController.cs
및 예제 파일을 제거합니다.
이제 솔루션에 두 개의 프로젝트가 포함됩니다. 다음 섹션에서는 ProductsApp 프로젝트의 콘텐츠를 ProductsCore 프로젝트로 마이그레이션하는 방법을 설명합니다.
구성 마이그레이션
ASP.NET Core는 App_Start 폴더 또는 Global.asax 파일을 사용하지 않습니다. 또한 web.config 파일은 게시 시간에 추가됩니다.
Startup
클래스:
- Global.asax대체합니다.
- 모든 앱 시작 작업을 처리합니다.
자세한 내용은 ASP.NET Core에서 앱 시작을 참조하세요.
모델 및 컨트롤러 마이그레이션
다음 코드는 ASP.NET Core에서 갱신할 ProductsController
를 설명합니다.
using ProductsApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
namespace ProductsApp.Controllers
{
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product
{
Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1
},
new Product
{
Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M
},
new Product
{
Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M
}
};
public IEnumerable<Product> GetAllProducts()
{
return products;
}
public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
}
ASP.NET Core용 ProductsController
를 업데이트합니다.
- 원래 프로젝트에서 새 프로젝트로
Controllers/ProductsController.cs
및 Models 폴더를 복사합니다. - 복사한 파일의 루트 네임스페이스를
ProductsCore
변경합니다. -
using ProductsApp.Models;
문을using ProductsCore.Models;
로 업데이트합니다.
ASP.NET Core에는 다음 구성 요소가 없습니다.
-
ApiController
클래스 -
System.Web.Http
네임스페이스 -
IHttpActionResult
인터페이스
다음을 변경하세요.
ApiController
를 ControllerBase로 바꿉니다.using Microsoft.AspNetCore.Mvc;
를 추가하여ControllerBase
참조를 해결합니다.using System.Web.Http;
삭제합니다.GetProduct
작업의 반환 형식을IHttpActionResult
ActionResult<Product>
변경합니다.GetProduct
작업의return
문을 다음과 같이 간소화합니다.return product;
라우팅 구성
ASP.NET Core API 프로젝트 템플릿에는 생성된 코드에 엔드포인트 라우팅 구성이 포함됩니다.
다음의 UseRouting 및 UseEndpoints 호출:
- 미들웨어 파이프라인에서 경로 일치 및 엔드포인트 실행을 등록합니다.
-
ProductsApp 프로젝트의
App_Start/WebApiConfig.cs
파일을 바꿉니다.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
다음과 같이 라우팅을 구성합니다.
ProductsController
클래스를 다음 특성으로 표시합니다.[Route("api/[controller]")] [ApiController]
이전
[Route]
특성은 컨트롤러의 특성 라우팅 패턴을 구성합니다.[ApiController]
특성은 특성 라우팅을 이 컨트롤러의 모든 작업에 대한 요구 사항으로 만듭니다.특성 라우팅은
[controller]
및[action]
같은 토큰을 지원합니다. 런타임 시 각 토큰은 각각 특성이 적용된 컨트롤러 또는 작업의 이름으로 바뀝니다. 토큰:- 프로젝트의 매직 문자열 수를 줄입니다.
- 자동 이름 바꾸기 리팩터링이 적용될 때 경로가 해당 컨트롤러 및 작업과 동기화된 상태로 유지되는지 확인합니다.
ProductsController
작업에 대한 HTTP 가져오기 요청을 사용하도록 설정합니다.-
[HttpGet]
작업에GetAllProducts
특성을 적용합니다. -
[HttpGet("{id}")]
작업에GetProduct
특성을 적용합니다.
-
마이그레이션된 프로젝트를 실행하고 /api/products
찾습니다. 세 가지 제품의 전체 목록이 나타납니다.
/api/products/1
로 이동합니다. 첫 번째 제품이 나타납니다.
추가 리소스
- ASP.NET Core로 웹 API 만들기
- ASP.NET Core 웹 API의 컨트롤러 작업 반환 형식
- ASP.NET Core MVC 대한 호환성 버전
ASP.NET Core