다음을 통해 공유


.NET 5의 ASP.NET Core에서 .NET 6으로 마이그레이션

이 문서에서는 .NET 5 프로젝트의 기존 ASP.NET Core를 .NET 6으로 업데이트하는 방법을 설명합니다. ASP.NET Core 3.1에서 .NET 6으로 마이그레이션하는 방법에 대한 지침은 ASP.NET Core 3.1에서 .NET 6으로 마이그레이션을 참조하세요.

필수 조건

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

사용 중인 global.json 파일이 특정 .NET SDK 버전을 대상으로 한다면, 해당 파일의 version 속성을 설치된 .NET 6 SDK 버전으로 업데이트하십시오. 다음은 그 예입니다.

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

대상 프레임워크 업데이트

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

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

  <PropertyGroup>
-    <TargetFramework>net5.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

</Project>

패키지 참조 업데이트

프로젝트 파일에서 각각 Microsoft.AspNetCore.*Microsoft.Extensions.* 패키지 참조의 Version 특성을 6.0.0 이상으로 업데이트합니다. 다음은 그 예입니다.

<ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.3" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="6.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" />
</ItemGroup>

새 호스팅 모델

ASP.NET Core 앱에 대한 새 .NET 6 최소 호스팅 모델에는 하나의 파일과 몇 줄의 코드만 필요합니다. .NET 6으로 마이그레이션하는 앱은 새 최소 호스팅 모델을 사용할 필요가 없습니다. 자세한 내용은 다음 섹션에서 새 최소 호스팅 모델을 사용할 필요가 없는 .NET 6으로 마이그레이션하는 앱을 참조하세요.

ASP.NET Core 빈 템플릿의 다음 코드는 새 최소 호스팅 모델을 사용하여 앱을 만듭니다.

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

최소 호스팅 모델:

  • 앱을 만드는 데 필요한 파일 수와 코드 줄이 대폭 줄어듭니다. 4줄의 코드가 있는 파일은 하나만 필요합니다.
  • Startup.csProgram.cs를 단일 Program.cs 파일로 통합합니다.
  • 최상위 문을 사용하여 앱에 필요한 코드를 최소화합니다.
  • 전역 using 지시문을 사용하여 필요한 using의 줄 수를 없애거나 최소화합니다.

다음 코드는 Startup.cs 사용되지 않는 문이 제거된 .NET 5 Web App 템플릿(Program.cs Pages)의 Razor 및 using 파일을 표시합니다.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// Unused usings removed.

namespace WebAppRPv5
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
    }
}
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
// Unused usings removed.

namespace WebAppRPv5
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

.NET 6의 ASP.NET Core에서 이전 코드는 다음으로 대체됩니다.

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

.NET 6의 이전 ASP.NET Core 샘플은 다음 방법을 보여줍니다.

최소 호스팅 모델을 사용하여 .NET 5 Startup 코드의 ASP.NET Core를 .NET 6으로 마이그레이션하는 자세한 예제는 이 문서의 뒷부분에서 제공합니다.

웹앱 템플릿에 대해 생성된 다른 파일에는 다음과 같은 몇 가지 변경 내용이 있습니다.

  • Index.cshtmlPrivacy.cshtml에서 사용되지 않는 using 문이 제거되었습니다.
  • RequestId in Error.cshtmlNRT(nullable 참조 형식)로 선언됩니다.
- public string RequestId { get; set; }
+ public string? RequestId { get; set; }
  • 로그 수준 기본값이 다음과 같이 변경되었습니다.appsettings.jsonappsettings.Development.json
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
+ "Microsoft.AspNetCore": "Warning"

이전 ASP.NET Core 템플릿 코드에서 "Microsoft": "Warning"이(가) "Microsoft.AspNetCore": "Warning"으로 변경되었습니다. 이 변경은 Microsoft 네임스페이스를 제외하고 모든 정보 메시지를 로깅합니다. 예를 들어 Microsoft.EntityFrameworkCore는 이제 정보 수준에서 로그됩니다.

새 호스팅 모델에 대한 자세한 내용은 질문과 대답 섹션을 참조하세요. NRT 및 .NET 컴파일러 null 상태 분석 채택에 대한 자세한 내용은 NRT(Nullable 참조 형식) 및 .NET 컴파일러 null 상태 정적 분석 섹션을 참조하세요.

6.0 이상을 사용하거나 마이그레이션하는 앱은 새 최소 호스팅 모델을 사용할 필요가 없습니다.

ASP.NET Core 3.1 및 5.0 템플릿에서 사용하는 Startup제네릭 호스트는 완전히 지원됩니다.

새로운 최소 호스팅 모델에서 Startup을 사용하십시오.

ASP.NET Core 3.1 및 5.0 앱은 새 최소 호스팅 모델에서 코드를 Startup 사용할 수 있습니다. 최소 호스팅 모델과 함께 사용하면 Startup 다음과 같은 이점이 있습니다.

  • Startup 클래스를 호출하는 데 감춰진 반영이 사용되지 않습니다.
  • 개발자가 Startup 호출을 제어하기 때문에 비동기 코드를 작성할 수 있습니다.
  • 코드는 ConfigureServicesConfigure를 교차되게 작성할 수 있습니다.

새 최소 호스팅 모델에서 Startup 코드를 사용할 때 한 가지 사소한 제한 사항은, Configure에 종속성을 삽입하려면 Program.cs의 서비스를 수동으로 해결해야 한다는 점입니다.

ASP.NET Core 3.1 또는 5.0 Razor Pages 템플릿에서 생성된 다음 코드를 고려합니다.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

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

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

이전 코드는 새 최소 호스팅 모델로 마이그레이션되었습니다.

using Microsoft.AspNetCore.Builder;

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);

var app = builder.Build();

startup.Configure(app, app.Environment);

app.Run();
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (!env.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

이전 코드 if (env.IsDevelopment()) 에서는 개발 모드에서 개발자 예외 페이지 미들웨어가 기본적으로 사용하도록 설정되므로 블록이 제거됩니다. 자세한 내용은 다음 섹션에서 .NET 5의 ASP.NET Core와 .NET 6 호스팅 모델 간의 차이점 을 참조하세요.

DI(사용자 지정 종속성 주입) 컨테이너를 사용하는 경우 강조 표시된 다음 코드를 추가합니다.

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);

// Using a custom DI container.
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(startup.ConfigureContainer);

var app = builder.Build();

startup.Configure(app, app.Environment);

app.Run();
using Autofac;
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    //  Using a custom DI container
    public void ConfigureContainer(ContainerBuilder builder)
    {
        // Configure custom container.
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (!env.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

최소 호스팅 모델을 사용하는 경우 엔드포인트 라우팅 미들웨어는 전체 미들웨어 파이프라인을 래핑하므로 경로를 명시적으로 호출 UseRouting 하거나 UseEndpoints 등록할 필요가 없습니다. UseRouting 경로 일치가 발생하는 위치를 지정하는 데 계속 사용할 수 있지만, 미들웨어 파이프라인의 시작 부분에서 경로를 일치시켜야 하는 경우 UseRouting 명시적으로 호출할 필요는 없습니다.

다음 코드에서 UseRouting에서 UseEndpointsStartup 호출이 제거됩니다. MapRazorPagesProgram.cs에서 호출됩니다.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (!env.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        //app.UseRouting();

        //app.UseEndpoints(endpoints =>
        //{
        //    endpoints.MapRazorPages();
        //});
    }
}
using Microsoft.AspNetCore.Builder;

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);

var app = builder.Build();

startup.Configure(app, app.Environment);

app.MapRazorPages();

app.Run();

새 최소 호스팅 모델을 사용하는 Startup 경우 다음과 같은 차이점을 염두에 두어야 합니다.

  • Program.cs 는 클래스의 인스턴스화 및 수명을 제어합니다 Startup .
  • 메서드에 Configure 삽입된 추가 서비스는 Program 클래스에서 수동으로 해결해야 합니다.

.NET 5의 ASP.NET Core와 .NET 6 호스팅 모델의 차이점

  • 개발 모드에서 개발자 예외 페이지 미들웨어는 기본적으로 사용하도록 설정됩니다.
  • 앱 이름은 기본적으로 진입점 어셈블리의 이름으로 설정됩니다 Assembly.GetEntryAssembly().GetName().FullName. 라이브러리에서 사용할 WebApplicationBuilder 때 MVC의 애플리케이션 파트 검색 이 작동할 수 있도록 앱 이름을 라이브러리의 어셈블리로 명시적으로 변경합니다. 자세한 지침은 이 문서의 콘텐츠 루트, 앱 이름 및 환경 변경을 참조하세요.
  • 엔드포인트 라우팅 미들웨어는 전체 미들웨어 파이프라인을 래핑하므로 경로를 명시적으로 호출 UseRouting 하거나 UseEndpoints 등록할 필요가 없습니다. UseRouting 경로 일치가 발생하는 위치를 지정하는 데 계속 사용할 수 있지만, 미들웨어 파이프라인의 시작 부분에서 경로를 일치시켜야 하는 경우 UseRouting 명시적으로 호출할 필요는 없습니다.
  • 파이프라인은 어떠한 실행이 시작되기 전에 만들어지므로 파이프라인을 빌드하는 동안 발생하는 예외는 호출 체인에는 나타나지 않습니다.
  • EF 마이그레이션과 같은 일부 도구는 앱의 컨텍스트에 액세스하고 사용자 지정 논리를 실행하기 위해 Program.CreateHostBuilder를 사용합니다IServiceProvider. 이러한 도구는 앱의 컨텍스트에서 사용자 지정 논리를 실행하는 새로운 기술을 사용하도록 업데이트되었습니다. Entity Framework 마이그레이션 은 이러한 방식으로 사용하는 Program.CreateHostBuilder 도구의 예입니다. 새 모델을 사용하도록 도구가 업데이트되었는지 확인하기 위해 노력하고 있습니다.
  • 클래스와 Startup 달리 최소 호스트는 서비스 공급자를 인스턴스화할 때 DI 범위를 자동으로 구성하지 않습니다. 범위가 필요한 컨텍스트의 경우 IServiceScope를 사용하여 호출 하여 새 범위를 인스턴스화해야 합니다. 자세한 내용은 앱 시작 시 서비스를 해결하는 방법을 참조하세요.
  • 앱 이름, 환경 또는 콘텐츠 루트를 만든 후에는 호스트 설정을 변경할 수 . 호스트 설정 변경에 대한 자세한 지침은 사용자 지정 IHostBuilder 또는 IWebHostBuilder을 참조하세요. 다음 강조 표시된 API는 예외를 발생시킵니다.
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

// WebHost

try
{
    builder.WebHost.UseContentRoot(Directory.GetCurrentDirectory());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseEnvironment(Environments.Staging);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseSetting(WebHostDefaults.ApplicationKey, "ApplicationName2");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseSetting(WebHostDefaults.ContentRootKey, Directory.GetCurrentDirectory());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseSetting(WebHostDefaults.EnvironmentKey, Environments.Staging);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

// Host
try
{
    builder.Host.UseEnvironment(Environments.Staging);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    // TODO: This does not throw
    builder.Host.UseContentRoot(Directory.GetCurrentDirectory());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Startup 클래스는 WebApplicationBuilder.Host 또는 WebApplicationBuilder.WebHost에서 사용할 수 없습니다. 다음 강조된 코드는 예외를 발생시킵니다.

    var builder = WebApplication.CreateBuilder(args);
    
    try
    {
        builder.Host.ConfigureWebHostDefaults(webHostBuilder =>
        {
            webHostBuilder.UseStartup<Startup>();
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw;    
    }
    
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
    var builder = WebApplication.CreateBuilder(args);
    
    try
    {
        builder.WebHost.UseStartup<Startup>();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw;    
    }
    
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
  • IHostBuilder에 대한 WebApplicationBuilder (WebApplicationBuilder.Host) 구현은 ConfigureServices, ConfigureAppConfiguration, 또는 ConfigureHostConfiguration 메서드의 실행을 지연하지 않습니다. 실행을 지연하지 않으면 WebApplicationBuilder을 사용하는 코드가 IServiceCollectionIConfiguration에 대한 변경 사항을 관찰할 수 있습니다. 다음 예제에서는 Service1IService로만 추가합니다.

    using Microsoft.Extensions.DependencyInjection.Extensions;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Host.ConfigureServices(services =>
    {
        services.TryAddSingleton<IService, Service1>();
    });
    
    builder.Services.TryAddSingleton<IService, Service2>();
    
    var app = builder.Build();
    
    // Displays Service1 only.
    Console.WriteLine(app.Services.GetRequiredService<IService>());
    
    app.Run();
    
    class Service1 : IService
    {
    }
    
    class Service2 : IService
    {
    }
    
    interface IService
    {
    }
    

이전 코드에서 콜백은 인라인으로 호출되며, 이는 builder.Host.ConfigureServices 호출될 때까지 지연되기보다 즉시 실행됩니다. 즉, Service1IServiceCollection 전에 Service2에 추가되고, Service1에 대해 IService가 해결됩니다.

.NET 6에서 ASP.NET Core용 라이브러리 빌드

기존 .NET 에코시스템은 IServiceCollection, IHostBuilder, 그리고 IWebHostBuilder를 중심으로 확장성을 구축했습니다. 이러한 속성은 WebApplicationBuilder에서 Services, Host, WebHost로 사용할 수 있습니다.

WebApplicationMicrosoft.AspNetCore.Builder.IApplicationBuilderMicrosoft.AspNetCore.Routing.IEndpointRouteBuilder를 모두 구현합니다.

우리는 라이브러리 작성자가 IHostBuilder, IWebHostBuilder, IApplicationBuilder, 및 IEndpointRouteBuilder을 대상으로 ASP.NET Core 특정 구성 요소를 계속해서 빌드할 것으로 예상합니다. 이렇게 하면 미들웨어, 경로 처리기 또는 기타 확장성 지점이 여러 호스팅 모델에서 계속 작동합니다.

FAQ(질문과 대답)

  • 새로운 최소 호스팅 모델이 덜 가능합니까?

    아니요. 새 호스팅 모델은 지원되는 IHostBuilder 시나리오의 IWebHostBuilder98개% 기능적으로 동일합니다. 특정 해결 IHostBuilder방법이 필요한 몇 가지 고급 시나리오가 있지만 매우 드물 것으로 예상됩니다.

  • 제네릭 호스팅 모델은 더 이상 사용되지 않는가요?

    아니요. 제네릭 호스팅 모델은 무기한 지원되는 대체 모델입니다. 제네릭 호스트는 새 호스팅 모델을 뒷받침하며 여전히 작업자 기반 애플리케이션을 호스트하는 기본 방법입니다.

  • 새 호스팅 모델로 마이그레이션해야 하나요?

    아니요. 새 호스팅 모델은 .NET 6 이상을 사용하여 새 앱을 호스트하는 기본 방법이지만 기존 앱에서 프로젝트 레이아웃을 변경해야 하는 것은 아닙니다. 즉, 앱은 프로젝트 파일 net5.0 의 대상 프레임워크를 .NET 5에서 .NET 6으로 업그레이드할 net6.0수 있습니다. 자세한 내용은 이 문서의 대상 프레임워크 업데이트 섹션을 참조하세요. 그러나 새 호스팅 모델에서만 사용할 수 있는 새로운 기능을 활용하려면 앱을 새 호스팅 모델로 마이그레이션하는 것이 좋습니다.

  • 최상위 문을 사용해야 하나요?

    아니요. 새 프로젝트 템플릿은 모두 최상위 문을 사용하지만 모든 .NET 6 앱에서 새 호스팅 API를 사용하여 웹 서버 또는 웹앱을 호스트할 수 있습니다.

  • Program 또는 Startup 클래스에 필드로 저장된 상태를 어디에 배치합니까?

    ASP.NET Core 앱에서 상태를 전달하기 위해 종속성 주입(DI)을 사용하는 것을 강력히 권장합니다.

    DI 외부에 상태를 저장하는 방법에는 두 가지가 있습니다.

    • 상태를 다른 클래스에 저장합니다. 클래스에 저장하면 앱의 어디에서나 액세스할 수 있는 정적 상태가 있다고 가정합니다.

    • 최상위 문에서 Program 생성된 클래스를 사용하여 상태를 저장합니다. 상태를 저장하는 데 사용하는 Program 것은 의미 체계 접근 방식입니다.

      var builder = WebApplication.CreateBuilder(args);
      
      ConfigurationValue = builder.Configuration["SomeKey"] ?? "Hello";
      
      var app = builder.Build();
      
      app.MapGet("/", () => ConfigurationValue);
      
      app.Run();
      
      partial class Program
      {
          public static string? ConfigurationValue { get; private set; }
      }
      
  • 사용자 지정 종속성 주입 컨테이너를 사용하는 경우 어떻게 하나요?

    사용자 지정 DI 컨테이너가 지원됩니다. 예를 들어 DI(사용자 지정 종속성 주입) 컨테이너를 참조하세요.

  • WebApplicationFactoryTestServer는 여전히 작동합니까?

    예. WebApplicationFactory<TEntryPoint> 는 새 호스팅 모델을 테스트하는 방법입니다. 예를 들어 WebApplicationFactory 또는 TestServer로 테스트하기를 참고하십시오.

Blazor

이 문서의 앞부분에 있는 지침에 따라 앱을 .NET 6으로 업데이트한 후 .NET 6 의 ASP.NET Core의 새로운 기능 링크를 따라 특정 기능을 채택합니다.

앱에 대한 Blazor 새로운 6.0 기능을 모두 채택하려면 다음 프로세스를 사용하는 것이 좋습니다.

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

SPA 프로젝트 마이그레이션

SPA 확장에서 Angular 앱 마이그레이션

GitHub 이슈를 참조하세요.

SPA 확장에서 React 앱 마이그레이션

Spa 확장에서 React 애플리케이션을 마이그레이션하기 위해 이 GitHub 이슈를 참조하세요.

Docker 이미지 업데이트

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

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

GitHub 문제 주요 변경 사항: 기본 콘솔 로거 형식이 JSON으로 설정됨을 참조하세요.

ASP.NET Core Razor SDK 변경

Razor 이제 컴파일러는 새 원본 생성기 기능을 활용하여 프로젝트의 뷰 및 페이지에서 컴파일된 C# 파일을 Razor 생성합니다. 이전 버전에서는 다음을 수행합니다.

  • 컴파일은 RazorGenerateRazorCompile 대상을 사용하여 코드를 생성했습니다. 이러한 대상은 더 이상 유효하지 않습니다. .NET 6에서는 코드 생성과 컴파일이 모두 컴파일러에 대한 단일 호출에서 지원됩니다. RazorComponentGenerateDependsOn 는 빌드를 실행하기 전에 필요한 종속성을 지정하는 데 계속 지원됩니다.
  • 애플리케이션에서 컴파일된 뷰 형식을 포함하는 별도의 Razor 어셈블리 AppName.Views.dll가 생성되었습니다. 이 동작은 더 이상 사용되지 않으며 앱 형식과 생성된 뷰를 모두 포함하는 단일 어셈블리 AppName.dll 가 생성됩니다.
  • 앱 유형 AppName.Views.dll 이 공용이었습니다. .NET 6에서는 앱 유형이 AppName.dll에 있으며 internal sealed에 있습니다. AppName.Views.dll에서 형식을 검색하는 앱은 AppName.dll에서 형식을 검색할 수 없습니다. 다음은 API 변경 사항을 보여줍니다.
- public class Views_Home_Index : global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<dynamic>
+ internal sealed class Views_Home_Index : global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<dynamic>

다음을 변경하세요.

  • 다음 속성은 더 이상 단일 단계 컴파일 모델에 적용되지 않습니다.
    • RazorTargetAssemblyAttribute
    • RazorTargetName
    • EnableDefaultRazorTargetAssemblyInfoAttributes
    • UseRazorBuildServer
    • GenerateRazorTargetAssemblyInfo
    • GenerateMvcApplicationPartsAssemblyAttributes

자세한 내용은 컴파일러가 더 이상 Views 어셈블리를 생성하지 않음을 참조Razor하세요.

프로젝트 템플릿에서 Duende Identity Server 사용

프로젝트 템플릿은 이제 Duende Server를 Identity사용합니다.

중요합니다

Duende Identity Server는 상호 사용권 계약이 있는 오픈 소스 제품입니다. Duende Server를 프로덕션 환경에서 사용하려는 경우 Identity Software에서 상업용 라이선스를 취득하고 라이선스 요금을 지불해야 할 수 있습니다. 자세한 내용은 Duende Software: Licenses를 참조하세요.

ASP.NET Core에 Identity를 사용하는 방법을 알아보려면 (dotnet/aspnetcore GitHub 리포지토리)를 참조Identity하세요.

새로운 요구 사항을 충족하기 위해 업데이트된 DbSet<Key> 버전에서 모든 KeysIdentityDbContext이라고 명명된 IPersistedGrantDbContext 속성을 추가하십시오. 키는 Duende Identity Server의 저장소와의 계약의 일부로 필요합니다.

public DbSet<Key> Keys { get; set; }

비고

Duende Identity Server에 대해 기존 마이그레이션을 다시 만들어야 합니다.

.NET 6에서 ASP.NET Core로 마이그레이션된 코드 샘플

6.0의 새로운 최소 호스팅 모델로 마이그레이션된 코드 샘플

주요 변경 사항 검토

다음 리소스를 참조하십시오.

NRT(Nullable 참조 형식) 및 .NET 컴파일러의 null 상태에 대한 정적 분석

ASP.NET Core 프로젝트 템플릿은 NRT(nullable 참조 형식)를 사용하고 .NET 컴파일러는 null 상태 정적 분석을 수행합니다. 이러한 기능은 C# 8에서 릴리스되었으며 .NET 6(C# 10) 이상에서 ASP.NET Core를 사용하여 생성된 앱에 대해 기본적으로 사용하도록 설정됩니다.

.NET 컴파일러의 null 상태 정적 분석 경고는 설명서 예제 또는 샘플 앱을 로컬로 업데이트하기 위한 가이드로 사용되거나 무시될 수 있습니다. Nullabledisable로 설정하여 앱의 프로젝트 파일에서 Null 상태 정적 분석을 비활성화할 수 있습니다. 우리는 .NET에 대해 학습하는 동안 컴파일러 경고가 산만해지면 설명서 예제나 샘플 앱에만 이 설정을 권장합니다. 프로덕션 프로젝트에서 null 상태 검사를 사용하지 않도록 설정하는 것은 권장되지 않습니다.

NRT, MSBuild Nullable 속성 및 앱 업데이트(지침 포함 #pragma )에 대한 자세한 내용은 C# 설명서의 다음 리소스를 참조하세요.

ASP.NET Core 모듈(ANCM)

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

애플리케이션 이름 변경

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

추가 리소스