Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
By Scott Addie
I den här artikeln går vi igenom uppdatering av ett befintligt ASP.NET Core 1.x-projekt till ASP.NET Core 2.0. Genom att migrera ditt program till ASP.NET Core 2.0 kan du dra nytta av många nya funktioner och prestandaförbättringar.
Befintliga ASP.NET Core 1.x-program baseras på versionsspecifika projektmallar. Allt eftersom ASP.NET Core-ramverket utvecklas, så gör även projektmallarna och startkoden i dem. Förutom att uppdatera ASP.NET Core-ramverket måste du uppdatera koden för ditt program.
Prerequisites
Följ handledningen Kom igång med ASP.NET Core.
Uppdatera Target Framework Moniker (TFM)
Projects targeting .NET Core should use the TFM of a version greater than or equal to .NET Core 2.0. Sök efter <TargetFramework> noden i filen .csproj och ersätt dess inre text med netcoreapp2.0:
<TargetFramework>netcoreapp2.0</TargetFramework>
Projekt som riktar sig till .NET Framework bör använda TFM för en version som är större än eller lika med .NET Framework 4.6.1. Sök efter <TargetFramework> noden i filen .csproj och ersätt dess inre text med net461:
<TargetFramework>net461</TargetFramework>
Note
.NET Core 2.0 erbjuder en mycket större yta än .NET Core 1.x. Om du riktar in dig på .NET Framework enbart på grund av saknade API:er i .NET Core 1.x kommer det sannolikt att fungera att rikta in sig på .NET Core 2.0.
Om projektfilen innehåller <RuntimeFrameworkVersion>1.{sub-version}</RuntimeFrameworkVersion>läser du det här GitHub-problemet.
Uppdatera .NET Core SDK-versionen i global.json
Om din lösning förlitar sig på en global.json fil för att rikta in sig på en specifik .NET Core SDK-version uppdaterar du dess version egenskap så att den använder 2.0-versionen som är installerad på datorn:
{
"sdk": {
"version": "2.0.0"
}
}
Uppdatera paketreferenser
Filen .csproj i ett 1.x-projekt visar varje NuGet-paket som används av projektet.
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>
Alla funktioner i ASP.NET Core 2.0 och Entity Framework Core 2.0 ingår i metapaketet.
ASP.NET Core 2.0-projekt som riktar sig till .NET Framework bör fortsätta att referera till enskilda NuGet-paket. Uppdatera attributet för Version varje <PackageReference /> nod till 2.0.0.
Här är till exempel listan över <PackageReference /> noder som används i ett typiskt ASP.NET Core 2.0-projekt som riktar sig till .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>
The package Microsoft.Extensions.CommandLineUtils has been retired. Den är fortfarande tillgänglig men stöds inte.
Uppdatera .NET CLI-verktyg
I filen .csproj, uppdatera attributet på varje Version nod till 2.0.0.
Här är till exempel listan över CLI-verktyg som används i ett typiskt ASP.NET Core 2.0-projekt som riktar sig till .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>
Byt namn på egenskapen Paketmålåterställning
Filen .csproj i ett 1.x-projekt använde en PackageTargetFallback nod och variabel:
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
Byt namn på både noden och variabeln till AssetTargetFallback:
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
Uppdatera main-metoden i Program.cs
I 1.x-projekt Main såg metoden Program.cs ut så här:
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();
}
}
}
I 2.0-projekt har metoden Main i Program.cs förenklats.
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();
}
}
Införandet av det här nya 2.0-mönstret rekommenderas starkt och krävs för att produktfunktioner som Entity Framework (EF) Core Migrations ska fungera. Om du till exempel kör Update-Database från package manager-konsolfönstret eller dotnet ef database update från kommandoraden (på projekt som konverterats till ASP.NET Core 2.0) genereras följande fel:
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.
Lägga till konfigurationsprovidrar
I 1.x-projekt lades konfigurationsleverantörer till i en app via Startup-konstruktorn. Stegen innefattar att skapa en instans av ConfigurationBuilder, ladda tillämpliga leverantörer (miljövariabler, appinställningar osv.) och initiera en medlem i 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; }
Det föregående exemplet läser in medlemmen Configuration med konfigurationsinställningar från appsettings.json och alla appsettings.{Environment}.json-filer som matchar IHostingEnvironment.EnvironmentName-egenskapen. Platsen för dessa filer finns på samma sökväg som Startup.cs.
I 2.0-projekt körs den boilerplate-konfigurationskod som är inbyggd i 1.x-projekt i bakgrunden. Miljövariabler och appinställningar läses till exempel in vid start. Motsvarande Startup.cs kod reduceras till IConfiguration initiering med den inmatade instansen:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
Om du vill ta bort standardprovidrar som lagts till av WebHostBuilder.CreateDefaultBuilder, anropar du metoden Clear på egenskapen IConfigurationBuilder.Sources inuti ConfigureAppConfiguration. Om du vill lägga till providrar igen använder du ConfigureAppConfiguration metoden i 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();
The configuration used by the CreateDefaultBuilder method in the preceding code snippet can be seen here.
Mer information finns i Konfiguration i ASP.NET Core.
Flytta databasinitieringskod
I 1.x-projekt med EF Core 1.x, ett kommando som dotnet ef migrations add gör följande:
- Instansierar en
Startup-instans - Anropar
ConfigureServicesmetoden för att registrera alla tjänster med beroendeinmatning (inklusiveDbContexttyper) - Utför nödvändiga uppgifter
I 2.0-projekt som använder EF Core 2.0 Program.BuildWebHost anropas för att hämta programtjänsterna. Till skillnad från 1.x har detta den ytterligare sidoeffekten att Startup.Configureanropa . Om 1.x-appen anropade initieringskoden för databasen i sin Configure metod kan oväntade problem uppstå. Om databasen till exempel inte finns ännu körs startkoden före körningen av EF Core migreringskommandot. Det här problemet gör att ett dotnet ef migrations list kommando misslyckas om databasen ännu inte finns.
Överväg följande 1.x-seed initieringskod i Configure metoden Startup.cs:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
SeedData.Initialize(app.ApplicationServices);
I 2.0-projekt flyttar du anropet SeedData.Initialize till Main metoden 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();
Från och med 2.0 är det en dålig praxis att göra något i BuildWebHost förutom att skapa och konfigurera webbvärden. Allt som handlar om att köra programmet ska hanteras utanför BuildWebHost – vanligtvis i Main metoden Program.cs.
Granska inställningen för vykompilering Razor
Snabbare starttid för program och mindre publicerade paket är av yttersta vikt för dig. Razor Därför är visningskompilering aktiverat som standard i ASP.NET Core 2.0.
MvcRazorCompileOnPublish Det krävs inte längre att du ställer in egenskapen på true. Om du inte inaktiverar visningskompilering kan egenskapen tas bort från .csproj filen.
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" />
Förlita dig på "light-up"-funktioner i Application Insights
Det är viktigt att enkelt konfigurera instrumentering av programprestanda. You can now rely on the new Application Insights "light-up" features available in the Visual Studio 2017 tooling.
ASP.NET Core 1.1-projekt som skapades i Visual Studio 2017 lade till Application Insights som standard. Om du inte använder Application Insights SDK direkt, utanför Program.cs och Startup.cs, följer du dessa steg:
Om du riktar in dig på .NET Core tar du bort följande
<PackageReference />nod från.csprojfilen:<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />Om du riktar in dig på .NET Core tar du bort anropet av
UseApplicationInsightstilläggsmetoden frånProgram.cs:public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .UseApplicationInsights() .Build(); host.Run(); }Ta bort APPLICATION Insights-API-anropet på klientsidan från
_Layout.cshtml. Den består av följande två kodrader:@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet @Html.Raw(JavaScriptSnippet.FullScript)
Om du använder Application Insights SDK direkt fortsätter du att göra det. The 2.0 metapackage includes the latest version of Application Insights, so a package downgrade error appears if you're referencing an older version.
Implementera autentisering/Identity förbättringar
ASP.NET Core 2.0 har en ny autentiseringsmodell och ett antal betydande ändringar i ASP.NET Core Identity. Om du har skapat projektet med enskilda användarkonton aktiverade, eller om du har lagt till autentisering manuellt eller Identity, läser du Migrera autentisering och Identity till ASP.NET Core 2.0.
Additional resources
ASP.NET Core