다음을 통해 공유


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로 마이그레이션하는 방법을 설명합니다.

필수 조건

새 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}")]

라우팅

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 4.x Web API에서 ASP.NET Core MVC로 마이그레이션하는 데 필요한 단계를 보여 줍니다.

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

필수 조건

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로 이동합니다. 첫 번째 제품이 나타납니다.

추가 리소스