Migrowanie z ASP.NET Core 1. x do 2,0Migrate from ASP.NET Core 1.x to 2.0

Przez Scott AddieBy Scott Addie

W tym artykule przeprowadzimy Cię przez aktualizację istniejącego projektu ASP.NET Core 1. x do ASP.NET Core 2,0.In this article, we walk you through updating an existing ASP.NET Core 1.x project to ASP.NET Core 2.0. Migrowanie aplikacji do ASP.NET Core 2,0 pozwala korzystać z wielu nowych funkcji i ulepszeń wydajności.Migrating your application to ASP.NET Core 2.0 enables you to take advantage of many new features and performance improvements.

Istniejące aplikacje ASP.NET Core 1. x są oparte na szablonach projektu specyficznych dla wersji.Existing ASP.NET Core 1.x applications are based off of version-specific project templates. W miarę rozwoju struktury ASP.NET Core, więc szablony projektu i początkowy kod zawarty w nich.As the ASP.NET Core framework evolves, so do the project templates and the starter code contained within them. Oprócz aktualizowania platformy ASP.NET Core, należy zaktualizować kod aplikacji.In addition to updating the ASP.NET Core framework, you need to update the code for your application.

Wymagania wstępnePrerequisites

Zobacz wprowadzenie do ASP.NET Core.See Get Started with ASP.NET Core.

Aktualizuj moniker platformy docelowej (TFM)Update Target Framework Moniker (TFM)

Projekty ukierunkowane na platformę .NET Core powinny korzystać z TFM wersji nowszej niż lub równej platformie .net Core 2,0.Projects targeting .NET Core should use the TFM of a version greater than or equal to .NET Core 2.0. Wyszukaj <TargetFramework> węzeł w pliku . csproj i Zastąp tekst wewnętrzny tekstem netcoreapp2.0 :Search for the <TargetFramework> node in the .csproj file, and replace its inner text with netcoreapp2.0:

<TargetFramework>netcoreapp2.0</TargetFramework>

Projekty ukierunkowane na .NET Framework powinny używać TFM wersji większej lub równej .NET Framework 4.6.1.Projects targeting .NET Framework should use the TFM of a version greater than or equal to .NET Framework 4.6.1. Wyszukaj <TargetFramework> węzeł w pliku . csproj i Zastąp tekst wewnętrzny tekstem net461 :Search for the <TargetFramework> node in the .csproj file, and replace its inner text with net461:

<TargetFramework>net461</TargetFramework>

Uwaga

Program .NET Core 2,0 oferuje znacznie większy obszar powierzchni niż .NET Core 1. x..NET Core 2.0 offers a much larger surface area than .NET Core 1.x. Jeśli chcesz, aby .NET Framework tylko z powodu brakujących interfejsów API w programie .NET Core 1. x, dla których będzie możliwe działanie programu .NET Core 2,0.If you're targeting .NET Framework solely because of missing APIs in .NET Core 1.x, targeting .NET Core 2.0 is likely to work.

Jeśli plik projektu zawiera <RuntimeFrameworkVersion>1.{sub-version}</RuntimeFrameworkVersion> , zobacz ten problemw usłudze GitHub.If the project file contains <RuntimeFrameworkVersion>1.{sub-version}</RuntimeFrameworkVersion>, see this GitHub issue.

Aktualizacja zestaw .NET Core SDK wersji w global.jsnaUpdate .NET Core SDK version in global.json

Jeśli rozwiązanie jest oparte na global.jsw pliku przeznaczonym dla konkretnej wersji zestaw .NET Core SDK, zaktualizuj swoją version Właściwość, aby użyć wersji 2,0 zainstalowanej na maszynie:If your solution relies upon a global.json file to target a specific .NET Core SDK version, update its version property to use the 2.0 version installed on your machine:

{
  "sdk": {
    "version": "2.0.0"
  }
}

Aktualizuj odwołania do pakietówUpdate package references

Plik . csproj w projekcie 1. x wyświetla każdy pakiet NuGet używany przez ten projekt.The .csproj file in a 1.x project lists each NuGet package used by the project.

W projekcie ASP.NET Core 2,0 docelowym .NET Core 2,0, pojedyncze odwołanie do pakietu w pliku csproj zastępuje kolekcję pakietów:In an ASP.NET Core 2.0 project targeting .NET Core 2.0, a single metapackage reference in the .csproj file replaces the collection of packages:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.9" />
</ItemGroup>

Wszystkie funkcje ASP.NET Core 2,0 i Entity Framework Core 2,0 są zawarte w pakiecie.All the features of ASP.NET Core 2.0 and Entity Framework Core 2.0 are included in the metapackage.

Projekty ASP.NET Core 2,0 .NET Framework powinny nadal odwoływać się do poszczególnych pakietów NuGet.ASP.NET Core 2.0 projects targeting .NET Framework should continue to reference individual NuGet packages. Zaktualizuj Version atrybut każdego <PackageReference /> węzła do 2.0.0.Update the Version attribute of each <PackageReference /> node to 2.0.0.

Na przykład poniżej znajduje się lista <PackageReference /> węzłów używanych w typowym .NET Framework projektu ASP.NET Core 2,0:For example, here's the list of <PackageReference /> nodes used in a typical ASP.NET Core 2.0 project targeting .NET Framework:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />
  <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.0" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" PrivateAssets="All" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
  <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.0" />
  <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" />
</ItemGroup>

Narzędzia aktualizacji interfejs wiersza polecenia platformy .NET CoreUpdate .NET Core CLI tools

W pliku . csproj zaktualizuj Version atrybut każdego <DotNetCliToolReference /> węzła do 2.0.0.In the .csproj file, update the Version attribute of each <DotNetCliToolReference /> node to 2.0.0.

Na przykład poniżej przedstawiono listę narzędzi interfejsu wiersza polecenia używanych w typowym projekcie ASP.NET Core 2,0, dla którego jest przeznaczony program .NET Core 2,0:For example, here's the list of CLI tools used in a typical ASP.NET Core 2.0 project targeting .NET Core 2.0:

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>

Zmień nazwę właściwości rezerwowej elementu docelowego pakietuRename Package Target Fallback property

Plik . csproj projektu 1. x użył PackageTargetFallback węzła i zmiennej:The .csproj file of a 1.x project used a PackageTargetFallback node and variable:

<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>

Zmień nazwę węzła i zmiennej na AssetTargetFallback :Rename both the node and variable to AssetTargetFallback:

<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

Aktualizowanie metody Main w Program.csUpdate Main method in Program.cs

W projektach 1. x Main metoda program.cs wyglądać następująco:In 1.x projects, the Main method of Program.cs looked like this:

using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore1App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }
    }
}

W przypadku projektów 2,0 Main metoda program.cs została uproszczona:In 2.0 projects, the Main method of Program.cs has been simplified:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore2App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

Przyjęcie tego nowego wzorca 2,0 jest zdecydowanie zalecane i jest wymagane do pracy z funkcjami produktu, takimi jak Entity Framework (EF) Core .The adoption of this new 2.0 pattern is highly recommended and is required for product features like Entity Framework (EF) Core Migrations to work. Na przykład uruchomienie Update-Database z okna konsoli Menedżera pakietów lub dotnet ef database update z wiersza polecenia (w projektach przekonwertowanych na ASP.NET Core 2,0) generuje następujący błąd:For example, running Update-Database from the Package Manager Console window or dotnet ef database update from the command line (on projects converted to ASP.NET Core 2.0) generates the following error:

Unable to create an object of type '<Context>'. Add an implementation of 'IDesignTimeDbContextFactory<Context>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

Dodawanie dostawców konfiguracjiAdd configuration providers

W projektach 1. x Dodawanie dostawców konfiguracji do aplikacji zostało zrealizowane za pośrednictwem Startup konstruktora.In 1.x projects, adding configuration providers to an app was accomplished via the Startup constructor. Kroki związane z tworzeniem wystąpienia ConfigurationBuilder , ładowanie odpowiednich dostawców (zmienne środowiskowe, ustawienia aplikacji itp.) i inicjowanie elementu członkowskiego IConfigurationRoot .The steps involved creating an instance of ConfigurationBuilder, loading applicable providers (environment variables, app settings, etc.), and initializing a member of IConfigurationRoot.

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        builder.AddUserSecrets<Startup>();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

W powyższym przykładzie załadujesz Configuration element członkowski z ustawieniami konfiguracji z programu appsettings.json , a także z dowolnego pliku appSettings. <EnvironmentName> plik JSON pasuje do IHostingEnvironment.EnvironmentName właściwości.The preceding example loads the Configuration member with configuration settings from appsettings.json as well as any appsettings.<EnvironmentName>.json file matching the IHostingEnvironment.EnvironmentName property. Lokalizacja tych plików jest taka sama jak ścieżka Startup.cs .The location of these files is at the same path as Startup.cs .

W projektach 2,0, kod konfiguracji standardowa nieodłącz się od projektów 1. x działa w tle.In 2.0 projects, the boilerplate configuration code inherent to 1.x projects runs behind-the-scenes. Na przykład zmienne środowiskowe i ustawienia aplikacji są ładowane podczas uruchamiania.For example, environment variables and app settings are loaded at startup. Równoważny kod Startup.cs został zredukowany do IConfiguration inicjacji z wstrzykiwanym wystąpieniem:The equivalent Startup.cs code is reduced to IConfiguration initialization with the injected instance:

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

public IConfiguration Configuration { get; }

Aby usunąć domyślnych dostawców dodanych przez WebHostBuilder.CreateDefaultBuilder , wywołaj Clear metodę we IConfigurationBuilder.Sources właściwości w ConfigureAppConfiguration .To remove the default providers added by WebHostBuilder.CreateDefaultBuilder, invoke the Clear method on the IConfigurationBuilder.Sources property inside of ConfigureAppConfiguration. Aby dodać dostawców z powrotem, użyj ConfigureAppConfiguration metody w program.cs :To add providers back, utilize the ConfigureAppConfiguration method in Program.cs :

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((hostContext, config) =>
        {
            // delete all default configuration providers
            config.Sources.Clear();
            config.AddJsonFile("myconfig.json", optional: true);
        })
        .Build();

CreateDefaultBuilderW tym miejscumożna zobaczyć konfigurację używaną przez metodę w poprzednim fragmencie kodu.The configuration used by the CreateDefaultBuilder method in the preceding code snippet can be seen here.

Aby uzyskać więcej informacji, zobacz Konfiguracja w ASP.NET Core.For more information, see Configuration in ASP.NET Core.

Przenieś kod inicjalizacji bazy danychMove database initialization code

W projektach 1. x używających EF Core 1. x, polecenie takie jak dotnet ef migrations add wykonuje następujące czynności:In 1.x projects using EF Core 1.x, a command such as dotnet ef migrations add does the following:

  1. Tworzy Startup wystąpienie wystąpieniaInstantiates a Startup instance
  2. Wywołuje ConfigureServices metodę, aby zarejestrować wszystkie usługi przy użyciu iniekcji zależności (w tym DbContext typów)Invokes the ConfigureServices method to register all services with dependency injection (including DbContext types)
  3. Wykonuje wymagane zadaniaPerforms its requisite tasks

W przypadku projektów 2,0 przy użyciu EF Core 2,0 Program.BuildWebHost jest wywoływana w celu uzyskania usług aplikacji.In 2.0 projects using EF Core 2.0, Program.BuildWebHost is invoked to obtain the application services. W przeciwieństwie do 1. x, ma to dodatkowy efekt uboczny wywoływania Startup.Configure .Unlike 1.x, this has the additional side effect of invoking Startup.Configure. Jeśli aplikacja 1. x wywołała kod inicjalizacji bazy danych w swojej Configure metodzie, mogą wystąpić nieoczekiwane problemy.If your 1.x app invoked database initialization code in its Configure method, unexpected problems can occur. Na przykład jeśli baza danych jeszcze nie istnieje, kod inicjujący jest uruchamiany przed wykonaniem polecenia EF Core migracji.For example, if the database doesn't yet exist, the seeding code runs before the EF Core Migrations command execution. Ten problem powoduje, że dotnet ef migrations list polecenie kończy się niepowodzeniem, jeśli baza danych jeszcze nie istnieje.This problem causes a dotnet ef migrations list command to fail if the database doesn't yet exist.

Rozważmy następujący kod inicjujący inicjatora 1. x w Configure metodzie Startup.cs :Consider the following 1.x seed initialization code in the Configure method of Startup.cs :

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

SeedData.Initialize(app.ApplicationServices);

W projektach 2,0 Przenieś SeedData.Initialize wywołanie do Main metody program.cs :In 2.0 projects, move the SeedData.Initialize call to the Main method of Program.cs :

var host = BuildWebHost(args);

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    try
    {
        // Requires using RazorPagesMovie.Models;
        SeedData.Initialize(services);
    }
    catch (Exception ex)
    {
        var logger = services.GetRequiredService<ILogger<Program>>();
        logger.LogError(ex, "An error occurred seeding the DB.");
    }
}

host.Run();

Począwszy od 2,0, jest to niewłaściwe rozwiązanie w przypadku BuildWebHost kompilacji i konfigurowania hosta sieci Web.As of 2.0, it's bad practice to do anything in BuildWebHost except build and configure the web host. Wszystkie informacje o działaniu aplikacji powinny być obsługiwane poza BuildWebHost — zwykle w Main metodzie program.cs .Anything that's about running the application should be handled outside of BuildWebHost — typically in the Main method of Program.cs .

Przegląd Razor Ustawienia kompilacji widokuReview Razor view compilation setting

Skrócenie czasu uruchamiania aplikacji i mniejszych opublikowanych pakietów mają na celu najwyższą ważność.Faster application startup time and smaller published bundles are of utmost importance to you. Z tego względu Razor kompilacja widoku jest domyślnie włączona w ASP.NET Core 2,0.For these reasons, Razor view compilation is enabled by default in ASP.NET Core 2.0.

Ustawienie MvcRazorCompileOnPublish właściwości na wartość true nie jest już wymagane.Setting the MvcRazorCompileOnPublish property to true is no longer required. Jeśli nie wyłączysz kompilacji widoku, właściwość może zostać usunięta z pliku . csproj .Unless you're disabling view compilation, the property may be removed from the .csproj file.

Podczas określania wartości docelowej .NET Framework nadal trzeba jawnie odwoływać się do Microsoft. AspNetCore. MVC. Razor . ViewCompilation pakiet NuGet w pliku csproj :When targeting .NET Framework, you still need to explicitly reference the Microsoft.AspNetCore.Mvc.Razor.ViewCompilation NuGet package in your .csproj file:

<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />

Korzystaj z funkcji "lekkich" Application InsightsRely on Application Insights "light-up" features

Istotna konfiguracja Instrumentacji wydajności aplikacji jest bardzo ważna.Effortless setup of application performance instrumentation is important. Teraz można polegać na nowych funkcjach Application Insights "świateł-up" dostępnych w narzędziach programu Visual Studio 2017.You can now rely on the new Application Insights "light-up" features available in the Visual Studio 2017 tooling.

Projekty ASP.NET Core 1,1 utworzone w programie Visual Studio 2017 zostały dodane domyślnie Application Insights.ASP.NET Core 1.1 projects created in Visual Studio 2017 added Application Insights by default. Jeśli nie używasz bezpośrednio zestawu SDK Application Insights, poza program.cs i Startup.cs , wykonaj następujące kroki:If you're not using the Application Insights SDK directly, outside of Program.cs and Startup.cs , follow these steps:

  1. Jeśli celem jest .NET Core, usuń następujący <PackageReference /> węzeł z pliku . csproj :If targeting .NET Core, remove the following <PackageReference /> node from the .csproj file:

    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
    
  2. Jeśli celem jest .NET Core, Usuń UseApplicationInsights wywołanie metody rozszerzenia z program.cs :If targeting .NET Core, remove the UseApplicationInsights extension method invocation from Program.cs :

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();
    
        host.Run();
    }
    
  3. Usuń Application Insights wywołanie interfejsu API po stronie klienta z _Layout. cshtml .Remove the Application Insights client-side API call from _Layout.cshtml . Obejmuje dwa następujące wiersze kodu:It comprises the following two lines of code:

    @inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet
    @Html.Raw(JavaScriptSnippet.FullScript)
    

Jeśli używasz bezpośrednio zestawu SDK Application Insights, Kontynuuj.If you are using the Application Insights SDK directly, continue to do so. Pakiet "2,0" zawiera najnowszą wersję Application Insights, więc w przypadku odwoływania się do starszej wersji pojawia się błąd obniżenia poziomu pakietów.The 2.0 metapackage includes the latest version of Application Insights, so a package downgrade error appears if you're referencing an older version.

Przyjmowanie uwierzytelniania/ Identity ulepszeńAdopt authentication/Identity improvements

ASP.NET Core 2,0 ma nowy model uwierzytelniania i wiele znaczących zmian ASP.NET Core Identity .ASP.NET Core 2.0 has a new authentication model and a number of significant changes to ASP.NET Core Identity. Jeśli projekt został utworzony z włączonymi indywidualnymi kontami użytkowników lub jeśli masz ręcznie dodane uwierzytelnianie lub Identity , zobacz Migrowanie uwierzytelniania i Identity do ASP.NET Core 2,0.If you created your project with Individual User Accounts enabled, or if you have manually added authentication or Identity, see Migrate Authentication and Identity to ASP.NET Core 2.0.

Dodatkowe zasobyAdditional resources