Migrace z ASP.NET Core 2.0 na 2.1

Autor: Rick Anderson

Přehled nových funkcí v ASP.NET Core 2.1 najdete v tématu Co je nového ve ASP.NET Core 2.1.

Tento článek:

  • Popisuje základy migrace aplikace ASP.NET Core 2.0 na 2.1.
  • Poskytuje přehled změn v šablonách webových ASP.NET Core aplikací.

Rychlým způsobem, jak získat přehled o změnách ve windows 2.1, je:

  • Vytvořte webovou ASP.NET Core 2.0 s názvem WebApp1.
  • Potvrďte webovou aplikaci WebApp1 v systému správy zdrojového kódu.
  • Odstraňte WebApp1 a vytvořte ASP.NET Core 2.1 s názvem WebApp1 na stejném místě.
  • Zkontrolujte změny ve verzi 2.1.

Tento článek obsahuje přehled migrace na ASP.NET Core 2.1. Neobsahuje úplný seznam všech změn potřebných k migraci na verzi 2.1. Některé projekty mohou vyžadovat další kroky v závislosti na možnostech vybraných při vytvoření projektu a provedených úpravách projektu.

Aktualizace souboru projektu tak, aby se používá verze 2.1

Aktualizujte soubor projektu:

  • Změňte cílovou rozhraní na .NET Core 2.1 aktualizací souboru projektu na <TargetFramework>netcoreapp2.1</TargetFramework> .
  • Nahraďte odkaz na balíček Microsoft.AspNetCore.All pro odkazem na balíček pro Microsoft.AspNetCore.App . Možná budete muset přidat závislosti, které byly odebrány z Microsoft.AspNetCore.All . Další informace naleznete v tématech Microsoft. AspNetCore. All Metapackage for ASP.NET Core 2,0 a Microsoft.AspNetCore.App metabalíček pro ASP.NET Core.
  • Odeberte atribut Version u odkazu na balíček Microsoft.AspNetCore.App na . Projekty, <Project Sdk="Microsoft.NET.Sdk.Web"> které používají , nemusí nastavovat verzi. Verze je implikovaná cílovou architekturou a je vybrána tak, aby co nejlépe odpovídala ASP.NET Core 2.1 funguje. Další informace najdete v části Pravidla pro projekty, které cílí na sdílenou architekturu.
  • U aplikací, které cílí na .NET Framework, aktualizujte každý odkaz na balíček na 2.1.
  • Odeberte odkazy na < elementy DotNetCliToolReference > pro následující balíčky. Tyto nástroje jsou ve výchozím nastavení součástí .NET Core CLI a není nutné je instalovat samostatně.
    • Microsoft.DotNet.Watcher.Tools ( dotnet watch )
    • Microsoft.EntityFrameworkCore.Tools.DotNet ( dotnet ef )
    • Microsoft.Extensions. Ukládání do mezipaměti. SqlConfig.Tools ( dotnet sql-cache )
    • Microsoft.Extensions.SecretManager.Tools ( dotnet user-secrets )
  • Volitelné: Můžete odebrat element < DotNetCliToolReference > pro Microsoft.VisualStudio.Web.CodeGeneration.Tools . Tento nástroj můžete nahradit globálně nainstalovanou verzí spuštěním dotnet tool install -g dotnet-aspnet-codegenerator .
  • Pro 2.1 je Razor doporučeným řešením pro distribuci souborů knihovna Razor tříd. Pokud vaše aplikace používá vložená zobrazení nebo jinak spoléhá na kompilaci souborů za běhu, přidejte do souboru Razor <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory> projektu <PropertyGroup> .

Následující kód ukazuje soubor projektu 2.0 vygenerovaný šablonou:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <UserSecretsId>aspnet-{Project Name}-{GUID}</UserSecretsId>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.9" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.3" PrivateAssets="All" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.4" PrivateAssets="All" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.2" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.4" />
  </ItemGroup>
</Project>

Následující kód ukazuje soubor projektu 2.1 vygenerovaný šablonou:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <UserSecretsId>aspnet-{Project Name}-{GUID}</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" PrivateAssets="All" />
  </ItemGroup>

</Project>

Pravidla pro projekty, které cílí na sdílenou rozhraní

Sdílená rozhraní je sada sestavení (.dllsouborů), které nejsou ve složkách aplikace. Aby bylo možné aplikaci spustit, musí být na počítači nainstalovaná sdílená rozhraní. Další informace najdete v tématu Sdílená rozhraní.

ASP.NET Core 2.1 zahrnuje následující sdílená rozhraní:

Verze určená odkazem na balíček je minimální požadovaná verze. Například projekt odkazující na verze 2.1.1 těchto balíčků nebude běžet na počítači, na který je nainstalovaný jenom modul runtime verze 2.1.0.

Známé problémy u projektů, které cílí na sdílenou architekturu:

  • Sada .NET Core 2.1.300 SDK (poprvé zahrnutá ve verzi Visual Studio 15.6) nastavila implicitní verzi na 2.1.0, což způsobilo konflikty s Microsoft.AspNetCore.App Entity Framework Core 2.1.1. Doporučeným řešením je upgradovat .NET Core SDK na verzi 2.1.301 nebo novější. Další informace najdete v tématu Balíčky, které sdílejízávislosti s Microsoft.AspNetCore.App nemohou odkazovat na verze oprav .

  • Všechny projekty, které musí použít nebo by měly přidat odkaz na balíček v souboru projektu, i když obsahují odkaz na projekt na jiný projekt Microsoft.AspNetCore.All Microsoft.AspNetCore.App pomocí nebo Microsoft.AspNetCore.All Microsoft.AspNetCore.App .

    Příklad:

    • MyApp má odkaz na balíček Microsoft.AspNetCore.App na .
    • MyApp.Tests má odkaz na projekt MyApp.csproj na .

    Přidejte odkaz na balíček pro Microsoft.AspNetCore.App do MyApp.Tests . Další informace najdete v tématu Testování integrace je obtížné nastavit a může se přerušit při údržbě sdílené architektury.

Aktualizace na image Dockeru 2.1

V ASP.NET Core 2.1 se image Dockeru migrují do úložiště dotnet/dotnet-docker GitHub . Následující tabulka ukazuje změny image a značky Dockeru:

2.0 2.1
microsoft/aspnetcore:2.0 microsoft/dotnet:2.1-aspnetcore-runtime
microsoft/aspnetcore-build:2.0 microsoft/dotnet:2.1-sdk

Změňte řádky v souboru Dockerfile tak, aby se ve sloupci FROM 2.1 předchozí tabulky používají nové názvy a značky image. Další informace najdete v tématu Migrace z úložišť dockeru aspnetcore do dotnet.

Změny hlavního souboru

Na následujících obrázcích jsou změny provedené v souboru Program.cs vygenerované šablonou.

staré rozdíly mezi verzemi

Předchozí obrázek ukazuje verzi 2.0 s odstraněními červeně.

Následující obrázek ukazuje kód 2.1. Zelený kód nahradil verzi 2.0:

Rozdíly mezi novými verzemi

Následující kód ukazuje verzi 2.1 souboru Program.cs:

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

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

Nový nahradí Main volání BuildWebHost createWebHostBuilder. Byl přidán IWebHostBuilder pro podporu nové infrastruktury integračního testu.

Změny po spuštění

Následující kód ukazuje změny kódu vygenerované šablonou 2.1. Všechny změny jsou nově přidaný kód s výjimkou těch, UseBrowserLink které byly odebrány:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

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

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

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

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            // If the app uses Session or TempData based on Session:
            // app.UseSession();

            app.UseMvc();
        }
    }
}

Předchozí změny kódu jsou podrobně psáno tady:

Změny ověřovacího kódu

ASP.NET Core 2.1 poskytuje ASP.NET Core Identity jako Razor knihovnu tříd (RCL).

Výchozí uživatelské rozhraní verze 2.1 v současné době neposkytuje významné Identity nové funkce pro verzi 2.0. Nahrazení Identity balíčkem RCL je volitelné. Mezi výhody nahrazení kódu vygenerované Identity šablonou verzí seznamu RCL patří:

  • Mnoho souborů se přesune ze zdrojového stromu.
  • Všechny opravy chyb nebo nové funkce pro Identity jsou zahrnuté v Microsoft.AspNetCore.App metabalíku. Aktualizace se automaticky aktualizuje Identity po Microsoft.AspNetCore.App aktualizaci.

Pokud jste provedli netýkací se změny kódu vygenerované Identity šablonou:

  • Předchozí výhody pravděpodobně neodůvodňují převod na verzi seznamu RCL.
  • Kód ve ASP.NET Core 2.0 je plně Identity podporovaný.

Identity 2.1 zpřístupňuje koncové body s oblastí Identity . Následující tabulka například ukazuje příklady koncových bodů, které se Identity mění z 2.0 na 2.1:

Adresa URL 2.0 Adresa URL 2.1
/Account/Login /Identity/Account/Login
/Account/Logout /Identity/Account/Logout
/Account/Manage /Identity/Account/Manage

Aplikace, které používají kód a nahrazují uživatelské rozhraní Identity 2.0 knihovnou Identity 2.1, musí brát v úvahu adresy URL, které mají před identifikátory URI předek Identity Identity /Identity segment. Jedním ze způsob, jak zpracovat nové koncové body, je nastavit Identity přesměrování, například z /Account/Login na /Identity/Account/Login .

Aktualizace Identity na verzi 2.1

Pro aktualizaci na Identity 2.1 jsou k dispozici následující možnosti.

  • Použijte kód Identity uživatelského rozhraní 2.0 beze změn. Použití Identity kódu uživatelského rozhraní 2.0 je plně podporováno. To je dobrý přístup, pokud byly provedeny významné změny generovaného Identity kódu.
  • Odstraňte do Identity svého projektu stávající kód 2.0 a generování Identity uživatelského rozhraní. Projekt bude používat ASP.NET Core Identity Razor knihovnu tříd. Kód a uživatelské rozhraní můžete vygenerovat pro libovolný kód Identity uživatelského rozhraní, který jste upravili. Použijte změny kódu na nově vytvořený kód uživatelského rozhraní.
  • Odstraňte stávající Identity kód 2.0 a generování Identity uživatelského rozhraní do projektu s možností Přepsat všechny soubory.

Nahraďte Identity uživatelské rozhraní 2.0 knihovnou tříd Identity 2.1. Razor

Tato část popisuje postup nahrazení kódu vygenerované šablonou ASP.NET Core 2.0 Identity ASP.NET Core Identity Razor knihovnou tříd. Následující kroky jsou pro projekt Pages, ale přístup k projektu Razor MVC je podobný.

  • Ověřte, že se soubor projektu aktualizoval tak, aby se používá verze 2.1.
  • Odstraňte následující složky a všechny soubory, které jsou v nich:
    • Kontrolery
    • Stránky/účet/
    • Rozšíření
  • Sestavte projekt.
  • Generování uživatelského Identity rozhraní do projektu:
    • Vyberte projekty ukončující _ soubor Layout.cshtml.
    • Vyberte + ikonu na pravé straně třídy Kontextu dat. Přijměte výchozí název.
    • Vyberte Přidat a vytvořte novou třídu kontextu dat. Pro generování uživatelského rozhraní se vyžaduje vytvoření nového kontextu dat. Nový kontext dat odeberete v další části.

Aktualizace po generování uživatelského rozhraní Identity

  • Odstraňte vygenerovanou odvozenou třídu ve složce Identity IdentityDbContext Areas/ Identity /Data/.

  • Odstraňte Identity / Identity areas/HostingStartup.cs.

  • Aktualizujte _ soubor LoginPartial.cshtml:

    • Přesuňte Pages/ _ LoginPartial.cshtml do Pages/Shared/ _ LoginPartial.cshtml.
    • Přidejte asp-area="Identity" do formuláře a ukotvené odkazy.
    • Aktualizujte <form /> element na <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })" method="post" id="logoutForm" class="navbar-right"> .

    Následující kód ukazuje aktualizovaný soubor _ LoginPartial.cshtml:

    @using Microsoft.AspNetCore.Identity
    
    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    
    @if (SignInManager.IsSignedIn(User))
    {
        <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
            <ul class="nav navbar-nav navbar-right">
                <li>
                    <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
                </li>
                <li>
                    <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
                </li>
            </ul>
        </form>
    }
    else
    {
        <ul class="nav navbar-nav navbar-right">
            <li><a asp-area="Identity" asp-page="/Account/Register">Register</a></li>
            <li><a asp-area="Identity" asp-page="/Account/Login">Log in</a></li>
        </ul>
    }
    

Aktualizujte ConfigureServices soubor následujícím kódem:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<ApplicationUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Register no-op EmailSender used by account confirmation and password reset 
    // during development
    services.AddSingleton<IEmailSender, EmailSender>();
}

Změny souborů Razor projektů Razor stránek

Soubor rozložení

  • Přesunutí souboru _ Pages/ Layout.cshtml do Pages/Shared/ _ Layout.cshtml

  • V oblasti Areas/ Identity /Pages/ _ ViewStart.cshtml změňte Layout = "/Pages/_Layout.cshtml" na Layout = "/Pages/Shared/_Layout.cshtml" .

  • Soubor _ Layout.cshtml má následující změny:

    • <partial name="_CookieConsentPartial" /> se přidá . Další informace najdete v tématu Podpora GDPR na ASP.NET Core.
    • jQuery se změní z 2.2.0 na 3.3.1.

_ValidationScriptsPartial.cshtml

  • Stránky/ _ ValidationScriptsPartial.cshtml se přesune na Pages/Shared/ _ ValidationScriptsPartial.cshtml.
  • jquery.validate/1.14.0 se změní na jquery.validate/1.17.0.

Nové soubory

Přidávají se následující soubory:

  • Privacy.cshtml
  • Privacy.cshtml.cs

Informace o předchozích souborech najdete ASP.NET Core GDPR v článku o ochraně osobních údajů.

Změny souborů projektů Razor MVC

Soubor rozložení

Soubor Layout.cshtml má následující změny:

  • <partial name="_CookieConsentPartial" /> se přidá .
  • Změny jQuery z 2.2.0 na 3.3.1

_ValidationScriptsPartial.cshtml

jquery.validate/1.14.0 změní na jquery.validate/1.17.0

Nové soubory a metody akcí

Přidávají se následující položky:

  • Views/ Home / Privacy .cshtml
  • Metoda Privacy akce se přidá do Home kontroleru.

Informace o předchozích souborech najdete ASP.NET Core GDPR v článku o ochraně osobních údajů.

Změny souboru launchSettings.jsv souboru

Protože ASP.NET Core aplikace ve výchozím nastavení používají PROTOKOL HTTPS, vlastnosti a launchSettings.jssouboru se změnily.

Následující kód JSON ukazuje předchozí soubor vygenerovaný šablonou 2.0 launchSettings.jsv souboru :

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:1799/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "WebApp1": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:1798/"
    }
  }
}

Následující kód JSON ukazuje novou šablonu 2.1 vygenerované launchSettings.jsv souboru :

{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:39191",
      "sslPort": 44390
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "WebApp1": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Další informace naleznete v tématu Vynutilit HTTPS v ASP.NET Core.

Změny způsobující chyby

Hlavička FileResult Range

FileResultuž ve výchozím nastavení zpracovává hlavičku Accept-Ranges. Pokud chcete Accept-Ranges hlavičku povolit, nastavte EnableRangeProcessing na true .

Hlavičky ControllerBase.File a PhysicalFile Range

Následující metody ControllerBase už ve výchozím nastavení nepracují hlavičku Accept-Ranges:

Pokud chcete Accept-Ranges hlavičku povolit, nastavte EnableRangeProcessing parametr na true .

Další změny