Compartilhar via


Migrar do ASP.NET Core 3.1 para 5.0

Este artigo explica como atualizar um projeto ASP.NET Core 3.1 existente para ASP.NET Core 5.0. Para obter instruções sobre como migrar do ASP.NET Core 3.1 para o ASP.NET Core 6.0, consulte Migrar do ASP.NET Core 3.1 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 5.0 que está instalada. Por exemplo:

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

Atualizar a estrutura de destino

Se estiver atualizando um Blazor WebAssembly projeto, vá para a seção Atualizar Blazor WebAssembly projetos. Para qualquer outro tipo de projeto ASP.NET Core, atualize o TFM (Moniker da Estrutura de Destino) do arquivo de projeto para net5.0:

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

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

</Project>

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.

Alterações na Blazor lógica de roteamento de aplicativos na versão 5.0.1 e outras versões 5.x até 6.0

O cálculo da precedência de rota foi alterado na versão de patch do ASP.NET Core 5.0.1. Isso poderá afetá-lo se você tiver definido rotas catch-all ou rotas com parâmetros opcionais.

Comportamento antigo

Com o comportamento anterior no ASP.NET Core 5.0.0 ou anterior, as rotas com precedência mais baixa, como {*slug}, são correspondidas antes de rotas com precedência mais alta, como /customer/{id}.

Novo comportamento

O novo comportamento no ASP.NET Core 5.0.1 ou posterior corresponde mais de perto ao comportamento de roteamento definido em aplicativos ASP.NET Core, em que a estrutura calcula e estabelece a precedência de rota para cada segmento primeiro e usa apenas o comprimento da rota para quebrar vínculos como critério secundário.

Motivo da alteração

O comportamento original é considerado um bug na implementação porque nossa meta é que o Blazor sistema de roteamento se comporte da mesma maneira que o sistema de roteamento ASP.NET Core para o subconjunto de recursos com suporte pelo Blazor roteamento.

Adicione o atributo PreferExactMatches ao componente Router no arquivo App.razor para aceitar o comportamento correto:

<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">

Quando PreferExactMatches está definido como @true, a correspondência de rotas prefere correspondências exatas em vez de caracteres curinga.

Importante

Todos os aplicativos devem definir PreferExactMatches explicitamente como @true.

A capacidade de defini-la PreferExactMatches@false como ou deixá-la não definida só é fornecida para compatibilidade com versões anteriores.

Quando o .NET 6 for lançado, o roteador sempre preferirá correspondências exatas e a opção PreferExactMatches não estará disponível.

Atualizar Blazor WebAssembly e Blazor Server projetos

As diretrizes nesta seção se aplicam a ambos os modelos de hospedagem Blazor. As seções a seguir nesta seção fornecem diretrizes adicionais específicas para hospedar modelos e tipos de aplicativo. Aplique as diretrizes de todas as seções relevantes ao seu aplicativo.

  1. Em wwwroot/index.html de um Blazor WebAssembly aplicativo ou do Pages/_Host.cshtml de um Blazor Server aplicativo, adicione um <link> elemento ao <head> elemento para estilos. Nos valores de atributo de elemento a seguir<link>, o espaço reservado href é o nome do assembly do {ASSEMBLY NAME} aplicativo.

    +<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet" />
    

    Blazor WebAssembly Autônomo ou Blazor Server exemplo:

    +<link href="BlazorSample.styles.css" rel="stylesheet" />
    

    Client projeto de um exemplo de solução hospedada Blazor WebAssembly:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Inclua um novo namespace no arquivo do aplicativo para virtualização de _Imports.razorcomponentes, Microsoft.AspNetCore.Components.Web.Virtualization. _Imports.razor Os arquivos a seguir mostram os namespaces padrão em aplicativos gerados a partir dos Blazor modelos de projeto. O espaço reservado {ASSEMBLY NAME} é o nome do assembly do aplicativo.

    Blazor WebAssembly (_Imports.razor):

    @using System.Net.Http
    @using System.Net.Http.Json
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.AspNetCore.Components.WebAssembly.Http
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    

    Blazor Server (_Imports.razor):

    @using System.Net.Http
    @using Microsoft.AspNetCore.Authorization
    @using Microsoft.AspNetCore.Components.Authorization
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    
  3. MainLayout No componente (Shared/MainLayout.razor), coloque a marcação HTML do componente com um <div> elemento que tem um class atributo definido como page:

    <div class="page">
    
        ...
    
    </div>
    
  4. Adicione os seguintes arquivos à pasta Shared:

    MainLayout.razor.css:

    .page {
        position: relative;
        display: flex;
        flex-direction: column;
    }
    
    .main {
        flex: 1;
    }
    
    .sidebar {
        background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
    }
    
    .top-row {
        background-color: #f7f7f7;
        border-bottom: 1px solid #d6d5d5;
        justify-content: flex-end;
        height: 3.5rem;
        display: flex;
        align-items: center;
    }
    
        .top-row ::deep a, .top-row .btn-link {
            white-space: nowrap;
            margin-left: 1.5rem;
        }
    
        .top-row a:first-child {
            overflow: hidden;
            text-overflow: ellipsis;
        }
    
    @media (max-width: 767.98px) {
        .top-row:not(.auth) {
            display: none;
        }
    
        .top-row.auth {
            justify-content: space-between;
        }
    
        .top-row a, .top-row .btn-link {
            margin-left: 0;
        }
    }
    
    @media (min-width: 768px) {
        .page {
            flex-direction: row;
        }
    
        .sidebar {
            width: 250px;
            height: 100vh;
            position: sticky;
            top: 0;
        }
    
        .top-row {
            position: sticky;
            top: 0;
            z-index: 1;
        }
    
        .main > div {
            padding-left: 2rem !important;
            padding-right: 1.5rem !important;
        }
    }
    

    NavMenu.razor.css:

    .navbar-toggler {
        background-color: rgba(255, 255, 255, 0.1);
    }
    
    .top-row {
        height: 3.5rem;
        background-color: rgba(0,0,0,0.4);
    }
    
    .navbar-brand {
        font-size: 1.1rem;
    }
    
    .oi {
        width: 2rem;
        font-size: 1.1rem;
        vertical-align: text-top;
        top: -2px;
    }
    
    .nav-item {
        font-size: 0.9rem;
        padding-bottom: 0.5rem;
    }
    
        .nav-item:first-of-type {
            padding-top: 1rem;
        }
    
        .nav-item:last-of-type {
            padding-bottom: 1rem;
        }
    
        .nav-item ::deep a {
            color: #d7d7d7;
            border-radius: 4px;
            height: 3rem;
            display: flex;
            align-items: center;
            line-height: 3rem;
        }
    
    .nav-item ::deep a.active {
        background-color: rgba(255,255,255,0.25);
        color: white;
    }
    
    .nav-item ::deep a:hover {
        background-color: rgba(255,255,255,0.1);
        color: white;
    }
    
    @media (min-width: 768px) {
        .navbar-toggler {
            display: none;
        }
    
        .collapse {
            /* Never collapse the sidebar for wide screens */
            display: block;
        }
    }
    
  5. O arquivo base wwwroot/css/app.css mais recente de um Blazor WebAssembly aplicativo ou arquivo wwwroot/css/site.css de um aplicativo Blazor Server inclui os estilos a seguir. Remova estilos extras deixando os estilos a seguir e qualquer um que você tenha adicionado ao aplicativo.

    A folha de estilos a seguir inclui apenas estilos base e não inclui estilos personalizados adicionados pelo desenvolvedor:

    html, body {
        font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    }
    
    a, .btn-link {
        color: #0366d6;
    }
    
    .btn-primary {
        color: #fff;
        background-color: #1b6ec2;
        border-color: #1861ac;
    }
    
    .content {
        padding-top: 1.1rem;
    }
    
    .valid.modified:not([type=checkbox]) {
        outline: 1px solid #26b050;
    }
    
    .invalid {
        outline: 1px solid red;
    }
    
    .validation-message {
        color: red;
    }
    
    #blazor-error-ui {
        background: lightyellow;
        bottom: 0;
        box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
        display: none;
        left: 0;
        padding: 0.6rem 1.25rem 0.7rem 1.25rem;
        position: fixed;
        width: 100%;
        z-index: 1000;
    }
    
    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
    

    Observação

    O exemplo anterior não mostra a @import diretiva para ícones Open Iconic (open-iconic-bootstrap.css), fornecida pelo modelo de projeto Blazor. Open Iconic foi abandonado por seus mantenedores.

Atualizar projetos Blazor WebAssembly

Siga as diretrizes na seção Atualização Blazor WebAssembly e Blazor Server projetos anteriores.

Para um projeto Blazor WebAssembly, incluindo o projeto Client de uma solução hospedada Blazor, aplique as seguintes alterações ao arquivo de projeto:

  1. Atualize o SDK de Microsoft.NET.Sdk.Web para Microsoft.NET.Sdk.BlazorWebAssembly:

    - <Project Sdk="Microsoft.NET.Sdk.Web">
    + <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    

    Observação

    Essa atualização só se aplica a projetos autônomos Blazor WebAssembly e aos Client projetos de soluções hospedadas Blazor.

  2. Atualize as propriedades a seguir:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Remova a referência de pacote para Microsoft.AspNetCore.Components.WebAssembly.Build:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Atualize outros pacotes para suas versões mais recentes. As versões mais recentes podem ser encontradas em NuGet.org.

  5. Em wwwroot/index.html, altere o elemento que carrega o App componente para um <div> elemento com um id definido como app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. Em Program.Main (Program.cs), altere a referência ao <app> elemento para um seletor CSS adicionando um hash # a ele:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Em Program.Main (Program.cs), altere um registro transitório HttpClient padrão para com escopo, se presente:

    -builder.Services.AddTransient(sp => new HttpClient 
    -    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    +builder.Services.AddScoped(sp => new HttpClient 
    +    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    
  8. No Program.Main (Program.cs) do Client aplicativo de soluções hospedadas Blazor:

    • Opcionalmente, substitua builder.HostEnvironment.BaseAddress por endereços base de cliente de cadeia de caracteres.
    • Altere todos os registros de fábrica de clientes transitórios nomeados para com escopo.
    -builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    -    client => client.BaseAddress = new Uri("https://localhost:5001"))
    -    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    -builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>()
    -    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    +builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    +    client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    +    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    +builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    +    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    

    No código anterior, o {APP NAMESPACE} espaço reservado é o namespace do aplicativo.

Aplicativo autônomo Blazor WebAssembly com contas Microsoft

Siga as diretrizes nas seções Atualizar Blazor WebAssembly e projetos e Blazor ServerAtualizar Blazor WebAssembly projetos anteriores.

Para um aplicativo autônomo Blazor WebAssembly registrado no portal do Azure usar o AAD (Microsoft Entra ID) para contas da Microsoft:

  • O aplicativo requer os escopos openid e offline_access:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Na folha portal do Azure registro de aplicativo Autenticação:

    1. Remova a configuração Web da plataforma.
    2. Adicione uma configuração de plataforma de aplicativo de página única com o URI de redirecionamento do aplicativo.
    3. Desabilite a concessão implícita para tokens de acesso e tokens de ID.

Para obter mais informações, consulte Proteger um aplicativo autônomo ASP.NET Core Blazor WebAssembly com contas da Microsoft.

Aplicativo autônomo Blazor WebAssembly com o Microsoft Entra ID (ME-ID)

Siga as diretrizes nas seções Atualizar Blazor WebAssembly e projetos e Blazor ServerAtualizar Blazor WebAssembly projetos anteriores.

Para um aplicativo autônomo Blazor WebAssembly registrado no portal do Azure para usar o Microsoft Entra ID (ME-ID):

  • O aplicativo requer o escopo https://graph.microsoft.com/User.Read:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Na folha portal do Azure registro de aplicativo Autenticação:

    1. Remova a configuração Web da plataforma.
    2. Adicione uma configuração de plataforma de aplicativo de página única com o URI de redirecionamento do aplicativo.
    3. Desabilite a concessão implícita para tokens de acesso e tokens de ID.

Para obter mais informações, consulte Proteger um aplicativo autônomo ASP.NET Core Blazor WebAssembly com contas do Microsoft Entra ID.

Aplicativo autônomo Blazor WebAssembly com o AAD (Azure Active Directory) B2C

Siga as diretrizes nas seções Atualizar Blazor WebAssembly e projetos e Blazor ServerAtualizar Blazor WebAssembly projetos anteriores.

Para um aplicativo autônomo Blazor WebAssembly registrado no portal do Azure usar o AAD (Azure Active Directory) B2C:

  • O aplicativo requer os escopos openid e offline_access:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Na folha portal do Azure registro de aplicativo Autenticação:

    1. Remova a configuração Web da plataforma.
    2. Adicione uma configuração de plataforma de aplicativo de página única com o URI de redirecionamento do aplicativo.
    3. Desabilite a concessão implícita para tokens de acesso e tokens de ID.

Para obter mais informações, consulte Proteger um aplicativo autônomo Blazor WebAssembly ASP.NET Core com o Azure Active Directory B2C.

Aplicativo Blazor WebAssembly hospedado com o Microsoft Entra ID (ME-ID) ou AAD B2C

Siga as diretrizes nas seções Atualizar Blazor WebAssembly e projetos e Blazor ServerAtualizar Blazor WebAssembly projetos anteriores.

O registro de aplicativo Client de uma solução hospedada Blazor que usa o AAD ou o AAD B2C para autenticação de usuário deve usar uma configuração de plataforma de aplicativo de página única dos Aplicativos do Azure.

Na folha portal do Azure Client registro de aplicativo Autenticação:

  1. Remova a configuração Web da plataforma.
  2. Adicione uma configuração de plataforma de aplicativo de página única com o URI de redirecionamento do aplicativo.
  3. Desabilite a concessão implícita para tokens de acesso e tokens de ID.

Para saber mais, veja:

Atualizar o projeto de servidor de uma solução hospedada Blazor

Siga as diretrizes nas seções anteriores:

Atualize o Server projeto de uma solução hospedada Blazor como um aplicativo ASP.NET Core seguindo as diretrizes gerais neste artigo.

Além disso, Server projetos que autenticam usuários em aplicativos cliente Blazor WebAssembly com o Microsoft Entra (ME-ID) ou B2C devem adotar novos pacotes da Microsoft Identity v2.0:

Para o AAD:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

Para o AAD B2C:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

Para as referências de pacote anteriores, determine as versões do pacote para os {VERSION} espaços reservados em NuGet.org:

Observação

O SDK do Server projeto em uma solução hospedada Blazor WebAssembly permanece Microsoft.NET.Sdk.Web:

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

Para saber mais, veja:

Limpar e recompilar a solução

Depois de migrar o aplicativo ou a solução para o .NET 5, limpo e recompile o aplicativo ou a solução. Se houver incompatibilidades de pacote entre novas referências de pacote e pacotes armazenados em cache:

  1. Limpe os caches de pacote NuGet executando o seguinte dotnet nuget locals comando em um shell de comando:

    dotnet nuget locals --clear all
    
  2. Limpe e recompile o aplicativo ou a solução.

Solucionar problemas

Siga as diretrizes de Solução de problemas no final do Blazor WebAssembly tópico de segurança que se aplica ao seu aplicativo:

Aplicativos Blazor WebAssembly autônomos:

Aplicativos Blazor WebAssembly hospedados:

Cliente não autorizado para o Microsoft Entra ID (ME-ID)

Depois de atualizar um Blazor WebAssembly aplicativo que usa o AAD para autenticação, você poderá receber o seguinte erro no retorno de chamada de logon para o aplicativo depois que o usuário entrar com o AAD:

informação: falha na autorização do Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]. Esses requisitos não foram atendidos: DenyAnonymousAuthorizationRequirement: requer um usuário autenticado.

Erro de retorno de chamada de logon do AAD:

  • Erro: unauthorized_client
  • Descrição: AADB2C90058: The provided application is not configured to allow public clients.

Para resolver o erro:

  1. No portal do Azure, acesse o manifesto do aplicativo.
  2. Defina o atrituto allowPublicClient como null ou true.

Atualizar um Blazor PWA (Aplicativo Web Progressivo)

Adicione o seguinte item ao arquivo de projeto do aplicativo PWA:

<ItemGroup>
  <ServiceWorker Include="wwwroot\service-worker.js" 
    PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>

Se o do projeto wwwroot/index.html (Blazor WebAssembly) ou Pages/_Host.cshtml (Blazor Server) contiver um elemento stylesheet <link> para scoped.styles.css de uma versão prévia anterior do 5.0, remova a <link> marca:

-<link href="_framework/scoped.styles.css/" rel="stylesheet" />

Atualizar bibliotecas de classes Razor (RCLs)

Migre Razor RCLs (bibliotecas de classes) para aproveitar novas APIs ou recursos introduzidos como parte do ASP.NET Core 5.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>net5.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>net5.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

Referências do pacote de atualização

No arquivo de projeto, atualize cada atributo do pacote Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*e System.Net.Http.JsonVersion para 5.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="5.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+    <PackageReference Include="System.Net.Http.Json" Version="5.0.0" />
</ItemGroup>

Atualizar imagens do Docker

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

- docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
+ docker pull mcr.microsoft.com/dotnet/aspnet:5.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 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 também 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 substitua 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();
    }

Saiba mais neste tópico do GitHub.

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ções na referência de pacotes que afetam alguns pacotes NuGet

Com a migração de alguns pacotes Microsoft.Extensions.* NuGet do repositório dotnet/extensions para o dotnet/runtime, conforme descrito em Migrating dotnet/extensions content para dotnet/runtime e dotnet/aspnetcore (aspnet/Announcements #411), as alterações de empacotamento estão sendo aplicadas a alguns dos pacotes migrados. Essas alterações geralmente resultam em alterações de namespace para a API do .NET.

Para pesquisar ainda mais as APIs para alterações no namespace do aplicativo ao migrar para o 5.0, use o navegador de API do .NET.

Migrar a Microsoft.Identity. Web

As páginas wiki a seguir explicam como migrar a Microsoft.Identity. Web de ASP.NET Core 3.1 a 5.0:

Os tutoriais a seguir também explicam a migração:

Analisar as alterações interruptivas

Para alterações interruptivas do .NET Core 3.1 para o .NET 5.0, consulte Alterações interruptivas para migração da versão 3.1 para a 5.0. O ASP.NET Core e o Entity Framework Core também estão incluídos na lista.