Migrace z ASP.NET Core 1.x na 2.0
Scott Addie
V tomto článku vás provedeme aktualizací existujícího projektu ASP.NET Core 1.x na ASP.NET Core 2.0. Migrace aplikace na ASP.NET Core 2.0 vám umožní využívat řadu nových funkcí a vylepšení výkonu.
Stávající ASP.NET Core 1.x jsou založené na šablonách projektů specifických pro verzi. S tím, ASP.NET Core se vyvíjí, se vyvíjely i šablony projektů a počáteční kód, který obsahuje. Kromě aktualizace ASP.NET Core rozhraní budete muset aktualizovat kód pro vaši aplikaci.
Požadavky
Aktualizace monikeru cílové architektury (TFM)
Projekty, které cílí na .NET Core, by měly používat TFM verze, která je větší nebo rovna .NET Core 2.0. Vyhledejte <TargetFramework> uzel v souboru .csproj a nahraďte jeho vnitřní text textem netcoreapp2.0 :
<TargetFramework>netcoreapp2.0</TargetFramework>
Projekty cílené .NET Framework by měly používat TFM verze větší nebo rovny .NET Framework 4.6.1. Vyhledejte <TargetFramework> uzel v souboru .csproj a nahraďte jeho vnitřní text textem net461 :
<TargetFramework>net461</TargetFramework>
Poznámka
.NET Core 2.0 nabízí mnohem větší plochu než .NET Core 1.x. Pokud cílíte na .NET Framework pouze kvůli chybějícím rozhraním API v .NET Core 1.x, bude pravděpodobně fungovat cílení na .NET Core 2.0.
Pokud soubor projektu obsahuje <RuntimeFrameworkVersion>1.{sub-version}</RuntimeFrameworkVersion> , podívejte se na tento GitHub problému.
Aktualizace .NET Core SDK verze v global.json
Pokud vaše řešení při cílení naglobal.jsverzi .NET Core SDK využívá soubor , aktualizujte jeho vlastnost tak, aby na počítači byla nainstalovaná verze version 2.0:
{
"sdk": {
"version": "2.0.0"
}
}
Aktualizace odkazů na balíček
Soubor .csproj v projektu 1.x obsahuje seznam NuGet který projekt používá.
V projektu ASP.NET Core 2.0, který cílí na .NET Core 2.0, nahradí jeden odkaz metapackage v souboru .csproj kolekci balíčků:
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.9" />
</ItemGroup>
Všechny funkce v ASP.NET Core 2.0 a Entity Framework Core 2.0 jsou součástí metabalíček.
ASP.NET Core 2.0, které cílí na .NET Framework, by měly nadále odkazovat na jednotlivé NuGet balíčky. Aktualizujte Version atribut každého <PackageReference /> uzlu na 2.0.0.
Tady je například seznam uzlů používaných v typickém <PackageReference /> projektu ASP.NET Core 2.0, který cílí .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>
Aktualizace .NET Core CLI nástrojů
V souboru .csproj aktualizujte atribut Version každého <DotNetCliToolReference /> uzlu na 2.0.0.
Tady je například seznam nástrojů rozhraní příkazového řádku používaných v typickém projektu ASP.NET Core 2.0, který cílí na .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>
Přejmenování záložní vlastnosti cíle balíčku
Soubor .csproj projektu 1.x použil uzel a PackageTargetFallback proměnnou:
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
Přejmenujte uzel i proměnnou na AssetTargetFallback :
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
Metoda Update Main v souboru Program.cs
V projektech 1.x Main vypadala metoda souboru Program.cs takhle:
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();
}
}
}
V projektech 2.0 byla Main zjednodušena metoda Program.cs:
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();
}
}
Tento nový model 2.0 se důrazně doporučuje a vyžaduje se pro to, aby fungovaly funkce produktu, jako jsou Entity Framework (EF) Core Migrations. Například spuštění z okna konzoly Správce balíčků nebo z příkazového řádku (u projektů převedených Update-Database dotnet ef database update na ASP.NET Core 2.0) vygeneruje následující chybu:
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.
Přidání zprostředkovatelů konfigurace
V projektech 1.x bylo přidání zprostředkovatelů konfigurace do aplikace provedeno prostřednictvím Startup konstruktoru . Postup zahrnoval vytvoření instance , načtení příslušných poskytovatelů (proměnné prostředí, nastavení aplikace atd.) a inicializaci ConfigurationBuilder člena 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; }
Předchozí příklad načte člen s nastavením konfigurace z a také z Configuration appsettings.json libovolného nastavení aplikace. <EnvironmentName> Soubor json odpovídající IHostingEnvironment.EnvironmentName vlastnosti . Umístění těchto souborů je ve stejné cestě jako startup.cs.
Ve 2.0 projektech běží často používaný konfigurační kód, který je součástí projektů 1.x, na pozadí. Například proměnné prostředí a nastavení aplikace se načítá při spuštění. Ekvivalentní kód Startup.cs je omezen na IConfiguration inicializaci injektované instance:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
Pokud chcete odebrat výchozí zprostředkovatele přidané pomocí WebHostBuilder.CreateDefaultBuilder , Clear vyvolat metodu ve vlastnosti uvnitř IConfigurationBuilder.Sources ConfigureAppConfiguration . Pokud chcete poskytovatele přidat zpátky, použijte ConfigureAppConfiguration metodu v souboru 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();
Konfiguraci, kterou používá CreateDefaultBuilder metoda v předchozím fragmentu kódu, najdete tady.
Další informace najdete v tématu Konfigurace v ASP.NET Core.
Přesunutí inicializačního kódu databáze
V projektech 1.x EF Core 1.x příkaz, jako je například dotnet ef migrations add , dělá toto:
- Vytvoří
Startupinstanci. - Vyvolá metodu
ConfigureServicespro registraci všech služeb pomocí injektáže závislostí (včetněDbContexttypů). - Provádí požadované úlohy.
V projektech ve verzi 2.0 EF Core 2.0 se vyvolá za účelem Program.BuildWebHost získání aplikačních služeb. Na rozdíl od verze 1.x to má další vedlejší efekt vyvolání Startup.Configure . Pokud vaše aplikace 1.x vyvolala inicializační kód databáze ve své Configure metodě, mohou nastat neočekávané problémy. Pokud například databáze ještě neexistuje, před provedením příkazu EF Core Migrations. Tento problém způsobí dotnet ef migrations list selhání příkazu, pokud databáze ještě neexistuje.
V metodě souboru Startup.cs zvažte následující inicializační kód Configure 1.x:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
SeedData.Initialize(app.ApplicationServices);
V projektech 2.0 přesuňte SeedData.Initialize volání Main metody souboru 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();
Od verze 2.0 je špatným postupem dělat cokoli kromě sestavení a BuildWebHost konfigurace webového hostitele. Cokoli, co se jedná o spuštění aplikace, by mělo být zpracováno mimo obvykle v BuildWebHost — Main metodě souboru Program.cs.
Kontrola Razor nastavení kompilace zobrazení
Rychlejší spuštění aplikace a menší publikované sady mají pro vás zásadní význam. Z těchto důvodů Razor je kompilace zobrazení ve výchozím nastavení ve ASP.NET Core 2.0.
Nastavení vlastnosti MvcRazorCompileOnPublish na hodnotu true už se nevyžaduje. Pokud kompilaci zobrazení nezakazíte, může být vlastnost ze souboru .csproj odebrána.
Při cílení .NET Framework, stále musíte explicitně odkazovat na Microsoft.AspNetCore.Mvc. Razor . ViewCompilation NuGet v souboru .csproj:
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />
Využití Přehledy aplikací
Je důležité bez námahy nastavit instrumentaci výkonu aplikací. Nyní se můžete spolehnout na nové funkce Přehledy, které jsou k dispozici v nástroji Visual Studio 2017.
ASP.NET Core 1.1 vytvořených v Visual Studio 2017 byly ve výchozím nastavení Přehledy aplikace. Pokud sadu Application Přehledy SDK Přehledy, mimo soubor Program.cs a Startup.cs, postupujte takto:
Pokud cílíte na .NET Core, odeberte ze
<PackageReference />souboru .csproj následující uzel:<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />Pokud cílíte na .NET Core, odeberte z
UseApplicationInsightsprogram.cs vyvolání metody rozšíření :public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .UseApplicationInsights() .Build(); host.Run(); }Odeberte volání rozhraní API Přehledy na straně klienta ze souboru _Layout.cshtml. Skládá se z následujících dvou řádků kódu:
@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet @Html.Raw(JavaScriptSnippet.FullScript)
Pokud používáte sadu Application Přehledy SDK přímo, pokračujte v tom. Metabalíček 2.0 obsahuje nejnovější verzi application Přehledy, takže pokud odkazujete na starší verzi, zobrazí se chyba downgradu balíčku.
Přijetí ověřování / Identity vylepšení
ASP.NET Core 2.0 má nový model ověřování a řadu významných změn v ASP.NET Core Identity . Pokud jste vytvořili projekt s povolenými individuálními uživatelskými účty nebo pokud jste ručně přidali ověřování nebo , podívejte se na stránku Migrace ověřování Identity a na ASP.NET Core Identity 2.0.