ASP.NET Core 3.1에서 6.0으로 마이그레이션하기

이 문서에서는 기존의 ASP.NET Core 3.1 프로젝트를 ASP.NET Core 6.0으로 변경하는 방법을 설명합니다. ASP.NET Core 5.0에서 6.0으로 업그레이드하려면 ASP.NET Core 5.0에서 6.0으로 마이그레이션을 참조하세요.

필수 조건

global.json에서 .NET SDK 버전 업데이트

global.json 파일을 사용하여 특정 .NET SDK 버전을 대상으로 지정하는 경우 version 속성을 설치된 .NET 6.0 SDK 버전으로 업데이트합니다. 예시:

{
  "sdk": {
-    "version": "3.1.200"
+    "version": "6.0.100"
  }
}

대상 프레임워크 업데이트

프로젝트 파일의 TFM(대상 프레임워크 모니커)net6.0으로 업데이트합니다.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

</Project>

패키지 참조 업데이트

프로젝트 파일에서 각 Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*, System.Net.Http.Json 패키지 참조의 Version 특성을 6.0.0 이상으로 업데이트합니다. 예시:

<ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.6" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.6" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.1.6" />
-    <PackageReference Include="System.Net.Http.Json" Version="3.2.1" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="6.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" />
+    <PackageReference Include="System.Net.Http.Json" Version="6.0.0" />
</ItemGroup>

binobj 폴더 삭제

binobj 폴더를 삭제해야 할 수 있습니다. NuGet 패키지 캐시를 지우려면 dotnet nuget locals --clear all을 실행합니다.

최소 호스팅 모델

ASP.NET Core 템플릿은 새 최소 호스팅 모델을 사용하여 코드를 생성합니다. 최소 호스팅 모델은 Startup.csProgram.cs을 단일 Program.cs파일로 통합합니다. ConfigureServicesConfigure는 더 이상 사용되지 않습니다. ASP.NET Core 3.1에서 6.0으로 마이그레이션하는 앱은 Startup를 사용하여 최소 호스팅 모델을 사용할 필요가 없으며, ASP.NET Core 3.1 템플릿에서 사용하는 일반 호스트가 완전히 지원됩니다.

새 최소 호스팅 모델과 함께 Startup을 사용하려면 새 최소 호스팅 모델에서 시작 사용을 참조하세요.

ASP.NET Core 6.0 템플릿에서 사용하는 다음 패턴을 사용하여 새 최소 호스팅 모델로 마이그레이션하려면 ASP.NET Core 6.0에서 새 최소 호스팅 모델로 마이그레이션된 코드 샘플ASP.NET Core 5.0에서 6.0으로 마이그레이션을 참조하세요.

RCL(Razor 클래스 라이브러리) 업데이트

ASP.NET Core 6.0의 일부로 도입된 새로운 API 또는 기능을 활용하도록 RCL(Razor 클래스 라이브러리)을 마이그레이션합니다.

구성 요소를 대상으로 하는 RCL을 업데이트하려면 다음을 수행합니다.

  1. 프로젝트 파일에서 다음 속성을 업데이트합니다.

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
  2. 다른 패키지를 최신 버전으로 업데이트합니다. 최신 버전은 NuGet.org에서 찾을 수 있습니다.

MVC를 대상으로 하는 RCL을 업데이트하려면 프로젝트 파일에서 다음 속성을 업데이트합니다.

<Project Sdk="Microsoft.NET.Sdk.Razor">

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

Blazor

Blazor 앱의 5.0 기능6.0 기능을 모두 채택하려면 다음 프로세스를 따르세요.

  • Blazor 프로젝트 템플릿 중 하나에서 새 6.0 Blazor 프로젝트를 만듭니다. 자세한 내용은 ASP.NET Core Blazor 도구를 참조하세요.
  • 앱의 구성 요소와 코드를 새 5.0 및 6.0 기능을 채택하도록 수정된 6.0 앱으로 이동합니다.

Docker 이미지 업데이트

Docker를 사용하는 앱의 경우 DockerfileFROM 문과 스크립트를 업데이트합니다. ASP.NET Core 6.0 런타임을 포함하는 기본 이미지를 사용합니다. ASP.NET Core 3.1과 6.0 간에 다음 docker pull 명령 차이를 고려합니다.

- docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
+ docker pull mcr.microsoft.com/dotnet/aspnet:6.0

제품 이름에서 “.NET”으로 이동하는 과정의 일환으로 Docker 이미지는 mcr.microsoft.com/dotnet/core 리포지토리에서 mcr.microsoft.com/dotnet으로 이동되었습니다. 자세한 내용은 .NET 5.0 - Docker 리포지토리 이름 변경(dotnet/dotnet-docker #1939)을 참조하세요.

ASP.NET Core MVC 및 Razor Pages의 모델 바인딩 변경 내용

DateTime 값은 UTC 시간으로 모델 바인딩됩니다

ASP.NET Core 3.1 이전에서 DateTime 값은 현지 시간으로 모델 바인딩되었으며, 여기서 시간대는 서버에 의해 결정되었습니다. 입력 형식 지정(JSON)에서 바인딩된 DateTime 값과 DateTimeOffset 값은 UTC 시간대로 바인딩되었습니다.

ASP.NET Core 5.0 이상에서는 모델 바인딩이 DateTime 값을 UTC 시간대와 일관되게 바인딩합니다.

이전 동작을 유지해야 하는 경우 Startup.ConfigureServices에서 DateTimeModelBinderProvider를 제거합니다.

services.AddControllersWithViews(options =>
    options.ModelBinderProviders.RemoveType<DateTimeModelBinderProvider>());

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder 교체 ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

C# 9 레코드 형식의 모델 바인딩을 위한 지원을 추가하기 위해 ComplexTypeModelBinderProvider는 다음과 같습니다.

  • 사용되지 않음으로 주석이 추가되었습니다.
  • 더 이상 기본적으로 등록되지 않습니다.

ModelBinderProviders 컬렉션에서 ComplexTypeModelBinderProvider의 존재에 의존하는 앱은 새 바인더 공급자를 참조해야 합니다.

- var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexTypeModelBinderProvider>();
+ var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexObjectModelBinderProvider>();

UseDatabaseErrorPage 사용되지 않음

개별 사용자 계정에 대한 옵션을 포함하는 ASP.NET Core 3.1 템플릿은 UseDatabaseErrorPage에 대한 호출을 생성합니다. UseDatabaseErrorPage는 이제 사용되지 않으며 다음 코드와 같이 AddDatabaseDeveloperPageExceptionFilterUseMigrationsEndPoint의 조합으로 대체되어야 합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
+   services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
+       app.UseMigrationsEndPoint();
-       app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

자세한 내용은 Obsoleting DatabaseErrorPage 미들웨어(dotnet/aspnetcore #24987)를 참조하세요.

ASP.NET Core 모듈(ANCM)

Visual Studio를 설치할 때 ANCM(ASP.NET Core 모듈)이 선택된 구성 요소가 아니거나 이전 버전의 ANCM이 시스템에 설치된 경우, 최신 .NET Core 호스팅 번들 설치 관리자(직접 다운로드)를 다운로드하고 설치 관리자를 실행합니다. 자세한 내용은 호스팅 번들을 참조하세요.

애플리케이션 이름 변경

.NET 6에서는 WebApplicationBuilder가 콘텐츠 루트 경로를 정규화하여 DirectorySeparatorChar로 끝납니다. HostBuilder 또는 WebHostBuilder에서 마이그레이션하는 대부분의 앱은 정규화되지 않으므로 동일한 앱 이름을 갖지 않습니다. 자세한 내용은 SetApplicationName을 참조하세요.

호환성이 손상되는 변경 검토

다음 리소스를 참조하세요.