다음을 통해 공유


ASP.NET Web API에서 ASP.NET Core로 마이그레이션

ASP.NET Core는 ASP.NET 4.x의 MVC 및 Web API 앱 모델을 ASP.NET Core MVC라는 단일 프로그래밍 모델로 결합합니다.

이 문서에서는 'ASP.NET Web API 2 시작하기'에서 만든 제품 컨트롤러를 ASP.NET Core로 마이그레이션하는 방법을 설명합니다.

Prerequisites

새 ASP.NET Core Web API 프로젝트 만들기

  1. 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.
  2. 검색 상자에 Web API를 입력합니다.
  3. ASP.NET Core Web API 템플릿을 선택하고 다음을 선택합니다.
  4. 새 프로젝트 구성 대화 상자에서 프로젝트 이름을 ProductsCore 로 지정하고 다음을 선택합니다.
  5. 추가 정보 대화 상자에서:
    1. 확인하십시오 Framework.NET 6.0 (장기 지원)입니다.
    2. 컨트롤러 사용 확인란(최소 API 사용 선택 취소)이 선택되어 있는지 확인합니다.
    3. 에서 OpenAPI 지원선택을 취소합니다.
    4. 선택하고생성합니다.

WeatherForecast 템플릿 파일 제거

  1. WeatherForecast.cs 프로젝트에서 Controllers/WeatherForecastController.cs 예제 파일을 제거합니다.
  2. 속성\launchSettings.js엽니다.
  3. 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();

제품 모델 복사

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 추가>새 폴더를 선택합니다. 폴더 이름을 Models로 지정합니다.
  2. Models 폴더를 마우스 오른쪽 단추로 클릭합니다. 추가>클래스를 선택합니다. 제품 클래스의 이름을 지정하고 추가를 선택합니다.
  3. 템플릿 모델 코드를 다음으로 바꿉다.
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 참조 예외로부터 보호합니다.

이 경우 NameCategory nullable 형식일 수 있습니다.

.NET 6 프로젝트의 ASP.NET Core는 기본적으로 nullable 참조 형식을 사용하도록 설정합니다. 자세한 내용은 Nullable 참조 형식참조하십시오.

ProductsController를 복사

  1. 컨트롤러 폴더를 마우스 오른쪽 단추로 클릭합니다.
  2. > 컨트롤러 추가...선택합니다.
  3. 새 스캐폴드된 항목 추가 대화 상자에서 MVC 컨트롤러 - 빈을 선택한 다음 추가를 선택합니다.
  4. 컨트롤러를 이름을 ProductsController 로 설정하고 추가를 선택합니다.
  5. 템플릿 컨트롤러 코드를 다음으로 바꿉니다.
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 작업의 반환 형식을 IHttpActionResultActionResult<Product>변경합니다. 자세한 내용은 Controller 작업 반환 형식참조하세요.

  • GetProduct 작업의 return 문을 다음 문으로 간소화합니다.

    return product;
    
  • 다음 섹션에서 설명하는 다음 특성을 추가합니다.

    • [Route("api/[controller]")]
    • [ApiController]
    • [HttpGet]
    • [HttpGet("{id}")]

Routing

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] 특성은 특성 라우팅을 이 컨트롤러의 모든 작업에 대한 요구 사항으로 만듭니다.

  • 지원합니다. 런타임 시 각 토큰은 각각 특성이 적용된 컨트롤러 또는 작업의 이름으로 바뀝니다. 토큰:

    • 경로에 하드 코딩된 문자열을 사용할 필요를 줄이거나 제거합니다.
    • 자동 이름 바꾸기 리팩터링이 적용될 때 경로가 해당 컨트롤러 및 작업과 동기화된 상태로 유지되는지 확인합니다.
  • HTTP 가져오기 요청은 다음 특성을 사용하여 ProductController 작업에 대해 사용하도록 설정됩니다.

    • [HttpGet] 특성이 GetAllProducts 작업에 적용되었습니다.
    • [HttpGet("{id}")] 특성이 GetProduct 작업에 적용되었습니다.

마이그레이션된 프로젝트를 실행하고 /api/products찾습니다. 예: https://localhost:<port>/api/products. 세 가지 제품의 전체 목록이 나타납니다. /api/products/1로 이동합니다. 첫 번째 제품이 나타납니다.

샘플 코드 보기 및 다운로드(다운로드 방법)

추가 리소스

이 문서에서는 ASP.NET 4.x Web API에서 ASP.NET Core MVC로 마이그레이션하는 데 필요한 단계를 보여 줍니다.

샘플 코드 보기 및 다운로드(다운로드 방법)

Prerequisites

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 프로젝트를 추가합니다.

  1. 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.
  2. 빈 솔루션 템플릿을 선택하고 다음을 선택합니다.
  3. 솔루션 이름을 으로 지정하고, WebAPIMigration로 설정합니다. 선택하고생성합니다.
  4. 기존 ProductsApp 프로젝트를 솔루션에 추가합니다.

마이그레이션할 새 API 프로젝트를 다음으로 추가합니다.

  1. 솔루션에 새 ASP.NET Core Web Application 프로젝트를 추가합니다.
  2. 새 프로젝트 구성 대화 상자에서 프로젝트 이름을 ProductsCore 이름을 지정하고 만들기선택합니다.
  3. 새 ASP.NET Core 웹 애플리케이션 만들기 대화 상자에서 .NET CoreASP.NET Core 3.1 선택되어 있는지 확인합니다. API 프로젝트 템플릿을 선택하고 만들기를 선택합니다.
  4. 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를 업데이트합니다.

  1. 원래 프로젝트에서 새 프로젝트로 Controllers/ProductsController.csModels 폴더를 복사합니다.
  2. 복사한 파일의 루트 네임스페이스를 ProductsCore변경합니다.
  3. using ProductsApp.Models; 문을 using ProductsCore.Models;로 업데이트합니다.

ASP.NET Core에는 다음 구성 요소가 없습니다.

  • ApiController 클래스
  • System.Web.Http 네임스페이스
  • IHttpActionResult 인터페이스

다음을 변경하세요.

  1. ApiControllerControllerBase로 바꿉니다. using Microsoft.AspNetCore.Mvc;를 추가하여 ControllerBase 참조를 해결합니다.

  2. using System.Web.Http;삭제합니다.

  3. GetProduct 작업의 반환 형식을 IHttpActionResultActionResult<Product>변경합니다.

  4. GetProduct 작업의 return 문을 다음과 같이 간소화합니다.

    return product;
    

라우팅 구성

ASP.NET Core API 프로젝트 템플릿에는 생성된 코드에 엔드포인트 라우팅 구성이 포함됩니다.

다음의 UseRoutingUseEndpoints 호출:

  • 미들웨어 파이프라인에서 경로 일치 및 엔드포인트 실행을 등록합니다.
  • 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();
    });
}

다음과 같이 라우팅을 구성합니다.

  1. ProductsController 클래스를 다음 특성으로 표시합니다.

    [Route("api/[controller]")]
    [ApiController]
    

    이전 [Route] 특성은 컨트롤러의 특성 라우팅 패턴을 구성합니다. [ApiController] 특성은 특성 라우팅을 이 컨트롤러의 모든 작업에 대한 요구 사항으로 만듭니다.

    특성 라우팅은 [controller][action]같은 토큰을 지원합니다. 런타임 시 각 토큰은 각각 특성이 적용된 컨트롤러 또는 작업의 이름으로 바뀝니다. 토큰:

    • 프로젝트의 매직 문자열 수를 줄입니다.
    • 자동 이름 바꾸기 리팩터링이 적용될 때 경로가 해당 컨트롤러 및 작업과 동기화된 상태로 유지되는지 확인합니다.
  2. ProductsController 작업에 대한 HTTP 가져오기 요청을 사용하도록 설정합니다.

    • [HttpGet] 작업에 GetAllProducts 특성을 적용합니다.
    • [HttpGet("{id}")] 작업에 GetProduct 특성을 적용합니다.

마이그레이션된 프로젝트를 실행하고 /api/products찾습니다. 세 가지 제품의 전체 목록이 나타납니다. /api/products/1로 이동합니다. 첫 번째 제품이 나타납니다.

추가 리소스