Migrar do ASP.NET Core 3.1 para 6.0

Esse artigo explica como atualizar um projeto existente do ASP.NET Core 3.1 para o ASP.NET Core 6.0. Para atualizar do ASP.NET Core 5.0 para o 6.0, consulte Migrar do ASP.NET Core 5.0 para o 6.0.

Pré-requisitos

Atualizar a versão do SDK do .NET Core no global.json

Se você depender de um arquivo global.json para direcionar uma versão específica do SDK do .NET Core, atualize a propriedade version para a versão do SDK do .NET 6.0 instalada. Por exemplo:

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

Atualizar a estrutura de destino

Atualize o TFM (Moniker da Estrutura de Destino) do arquivo de projeto para net6.0:

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

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

</Project>

Referências do pacote de atualização

No arquivo de projeto, atualize cada atributo de referência Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.* e System.Net.Http.Json do pacote Version para 6.0.0 ou posterior. Por exemplo:

<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>

Exclua as pastas bin e obj

Talvez seja necessário excluir as pastas bin e obj . Execute dotnet nuget locals --clear all para limpar o cache do pacote NuGet.

Modelo de hospedagem mínimo

Os modelos ASP.NET Core geram código usando o novo modelo de hospedagem mínima. O modelo de hospedagem mínimo unifica Startup.cs e Program.cs em um único arquivo Program.cs. ConfigureServices e Configure não são mais usados. Os aplicativos que migram do ASP.NET Core 3.1 para o 6.0 não precisam usar o modelo de hospedagem mínimo. Usar Startup e o Host Genérico usado pelos modelos do ASP.NET Core 3.1 é totalmente compatível.

Para usar Startup com o novo modelo de hospedagem mínima, consulte Usar a inicialização com o novo modelo de hospedagem mínima.

Para migrar para o novo modelo de hospedagem mínima usando o padrão a seguir usado pelos modelos do ASP.NET Core 6.0, consulte Exemplos de código migrados para o novo modelo de hospedagem mínimo no ASP.NET Core 6.0 e Migrar do ASP.NET Core 5.0 para o 6.0

Atualizar bibliotecas de classes Razor (RCLs)

Migre bibliotecas de classes Razor (RCLs) para aproveitar novas APIs ou recursos introduzidos como parte do ASP.NET Core 6.0.

Para atualizar uma RCL direcionada a componentes:

  1. Atualize as seguintes propriedades no arquivo de projeto:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
  2. Atualize outros pacotes para suas versões mais recentes. As versões mais recentes podem ser encontradas em NuGet.org.

Para atualizar uma RCL direcionada ao MVC, atualize as seguintes propriedades no arquivo de projeto:

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

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

Blazor

Para adotar todos os novos recursos 5.0 e 6.0para aplicativos do Blazor, recomendamos o seguinte processo:

  • Crie um novo projeto 6.0 Blazor de um dos modelos de projeto Blazor. Para obter mais informações, confira Ferramentas para ASP.NET Core Blazor.
  • Mova os componentes e o código do aplicativo para o aplicativo 6.0 fazendo modificações para adotar os novos recursos 5.0 e 6.0.

Atualizar imagens do Docker

Para aplicativos que usam o Docker, atualize suas instruções e scripts do DockerfileFROM . Use uma imagem base que inclua o runtime do ASP.NET Core 6.0. Considere a seguinte diferença de comando docker pull entre o ASP.NET Core 3.1 e o 6.0:

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

Como parte da mudança para ".NET" como o nome do produto, as imagens do Docker foram movidas dos mcr.microsoft.com/dotnet/core repositórios para mcr.microsoft.com/dotnet. Para obter mais informações, consulte .NET 5.0 – Alteração de nome do repositório do Docker (dotnet/dotnet-docker #1939).

Alterações de associação de modelo no ASP.NET Core MVC e Páginas do Razor

Os valores DateTime são associados ao modelo como horários UTC

No ASP.NET Core 3.1 e anteriores, os valores DateTime eram associados ao modelo como hora local, onde o fuso horário era determinado pelo servidor. Os valores DateTime associados à formatação de entrada (JSON) e os valores DateTimeOffset foram associados como fusos horários UTC.

No ASP.NET Core 5.0 e posterior, a associação de modelo associa valores DateTime consistentemente ao fuso horário UTC.

Para manter o comportamento anterior, remova o DateTimeModelBinderProvider em Startup.ConfigureServices:

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder substituta ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Para adicionar suporte para tipos de registro C# 9 de associação de modelo, o ComplexTypeModelBinderProvider é:

  • Anotado como obsoleto.
  • Não é mais registrado por padrão.

Os aplicativos que dependem da presença do ComplexTypeModelBinderProvider na coleção ModelBinderProviders precisam referenciar o novo provedor associador:

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

UseDatabaseErrorPage obsoleto

Os modelos ASP.NET Core 3.1 que incluem uma opção para contas de usuário individuais geram uma chamada para UseDatabaseErrorPage. UseDatabaseErrorPage agora está obsoleto e deve ser substituído por uma combinação de AddDatabaseDeveloperPageExceptionFilter e UseMigrationsEndPoint, conforme mostrado no código a seguir:

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();
    }

Para obter mais informações, consulte DatabaseErrorPage middleware em obsolescência (dotnet/aspnetcore #24987).

Módulo do ASP.NET Core (ANCM)

Se o Módulo do ASP.NET Core (ANCM) não foi um componente selecionado quando o Visual Studio foi instalado ou se uma versão anterior do ANCM foi instalada no sistema, baixe o Instalador de Pacote de Hospedagem do .NET Core (download direto) mais recente e execute o instalador. Para obter mais informações, consulte Hospedagem.

Alteração do nome do aplicativo

No .NET 6, WebApplicationBuilder normaliza o caminho raiz do conteúdo para terminar com um DirectorySeparatorChar. A maioria dos aplicativos que migram de HostBuilder ou de WebHostBuilder não compartilham o mesmo nome de aplicativo porque não estão normalizados. Para obter mais informações, consulte SetApplicationName

Analisar as alterações interruptivas

Consulte os seguintes recursos: