Migrate from ASP.NET Core 2.0 to 2.1 (Migrieren von ASP.NET Core 2.0 zu 2.1)
Von Rick Anderson
Sehen Sie sich die Neuerungen in ASP.NET Core 2.1 an, um einen Überblick über die neuen Features in ASP.NET Core 2.1 zu finden.
Dieser Artikel:
- Behandelt die Grundlagen der Migration einer ASP.NET Core 2.0-App zu 2.1.
- Enthält eine Übersicht über die Änderungen an den ASP.NET Core Webanwendungsvorlagen.
Eine schnelle Möglichkeit, einen Überblick über die Änderungen in 2.1 zu erhalten, besteht darin:
- Erstellen Sie eine ASP.NET Core 2.0-Web-App mit dem Namen "WebApp1".
- Übernehmen Sie das WebApp1 in einem Quellcodeverwaltungssystem.
- Löschen Sie WebApp1, und erstellen Sie eine ASP.NET Core 2.1-Web-App namens "WebApp1" an derselben Stelle.
- Überprüfen Sie die Änderungen in der Version 2.1.
Dieser Artikel enthält eine Übersicht über die Migration zu ASP.NET Core 2.1. Es enthält keine vollständige Liste aller Änderungen, die zum Migrieren zu Version 2.1 erforderlich sind. Einige Projekte erfordern möglicherweise weitere Schritte, je nachdem, welche Optionen ausgewählt wurden, wenn das Projekt erstellt und änderungen am Projekt vorgenommen wurden.
Aktualisieren der Projektdatei, damit sie die 2.1-Versionen verwendet
Aktualisieren der Projektdatei:
- Ändern Sie das Zielframework in .NET Core 2.1, indem Sie die Projektdatei auf
<TargetFramework>netcoreapp2.1</TargetFramework>
. - Ersetzen Sie den Paketverweis für
Microsoft.AspNetCore.All
einen Paketverweis fürMicrosoft.AspNetCore.App
. Möglicherweise müssen Sie Abhängigkeiten hinzufügen, die entferntMicrosoft.AspNetCore.All
wurden. Weitere Informationen finden Sie unter Microsoft.AspNetCore.All metapackage for ASP.NET Core 2.0 and Microsoft.AspNetCore.App metapackage for ASP.NET Core. - Entfernen Sie das Attribut "Version" für den Paketverweis auf
Microsoft.AspNetCore.App
. Projekte, die die Version nicht<Project Sdk="Microsoft.NET.Sdk.Web">
festlegen müssen. Die Version wird vom Zielframework impliziert und ausgewählt, um die Funktionsweise ASP.NET Core 2.1 optimal abzugleichen. Weitere Informationen finden Sie in den Regeln für Projekte, die auf den Abschnitt "Freigegebenes Framework" abzielen . - Aktualisieren Sie für Apps, die auf die .NET Framework abzielen, jeden Paketverweis auf 2.1.
- Entfernen Sie Verweise auf <DotNetCliToolReference-Elemente> für die folgenden Pakete. Diese Tools werden standardmäßig in der .NET Core CLI gebündelt und müssen nicht separat installiert werden.
- Microsoft.DotNet.Watcher.Tools (
dotnet watch
) - Microsoft.EntityFrameworkCore.Tools.DotNet (
dotnet ef
) - Microsoft.Extensions.Caching.SqlConfig.Tools (
dotnet sql-cache
) - Microsoft.Extensions.SecretManager.Tools (
dotnet user-secrets
)
- Microsoft.DotNet.Watcher.Tools (
- Optional: Sie können das <DotNetCliToolReference-Element> für
Microsoft.VisualStudio.Web.CodeGeneration.Tools
. Sie können dieses Tool durch eine global installierte Version ersetzen, indem Sie ausführendotnet tool install -g dotnet-aspnet-codegenerator
. - Für 2.1 ist eine Razor Klassenbibliothek die empfohlene Lösung zum Verteilen von Razor Dateien. Wenn Ihre App eingebettete Ansichten verwendet oder anderweitig auf die Laufzeitkompilierung von Razor Dateien angewiesen ist, fügen Sie einer
<PropertyGroup>
Projektdatei hinzu<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
.
Das folgende Markup zeigt die vom Vorlage generierte Projektdatei 2.0:
<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>
Das folgende Markup zeigt die vom Vorlage generierte Projektdatei 2.1:
<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>
Regeln für Projekte, die auf das freigegebene Framework abzielen
Ein freigegebenes Framework besteht aus einer Reihe von Assemblys (DLL-Dateien), die sich nicht in den Ordnern der App befinden. Das freigegebene Framework muss zum Ausführen der App auf dem Computer installiert sein. Weitere Informationen finden Sie unter The shared framework (Das freigegebene Framework).
ASP.NET Core 2.1 enthält die folgenden freigegebenen Frameworks:
Die durch den Paketverweis angegebene Version ist die mindest erforderliche Version. Ein Projekt, das beispielsweise auf die 2.1.1.1-Versionen dieser Pakete verweist, wird nicht auf einem Computer ausgeführt, auf dem nur die 2.1.0-Laufzeit installiert ist.
Bekannte Probleme für Projekte, die auf ein freigegebenes Framework abzielen:
Das .NET Core 2.1.300 SDK (zuerst in Visual Studio 15.6 enthalten) legt die implizite Version von
Microsoft.AspNetCore.App
2.1.0 fest, die Konflikte mit Entity Framework Core 2.1.1 verursacht hat. Die empfohlene Lösung besteht darin, das .NET Core SDK auf 2.1.301 oder höher zu aktualisieren. Weitere Informationen finden Sie unter Pakete, die Abhängigkeiten mit Microsoft.AspNetCore.App nicht auf Patchversionen verweisen können.Alle Projekte, die einen Paketverweis für das Paket in der Projektdatei verwenden oder
Microsoft.AspNetCore.App
hinzufügen sollten, auch wenn sie einen Projektverweis auf ein anderes Projekt mitMicrosoft.AspNetCore.All
Microsoft.AspNetCore.All
oderMicrosoft.AspNetCore.App
enthalten.Beispiel:
MyApp
enthält einen Paketverweis aufMicrosoft.AspNetCore.App
.MyApp.Tests
weist einen Projektverweis aufMyApp.csproj
.
Fügen Sie einen Paketverweis für
Microsoft.AspNetCore.App
MyApp.Tests
. Weitere Informationen finden Sie unter Integrationstests ist schwierig einzurichten und kann bei der Wartung des freigegebenen Frameworks unterbrechen.
Aktualisieren auf die Docker-Images von 2.1
In ASP.NET Core 2.1 wurden die Docker-Images zum dotnet/dotnet-docker GitHub Repository migriert. In der folgenden Tabelle sind die Docker-Image- und Tagänderungen aufgeführt:
2.0 | 2.1 |
---|---|
microsoft/aspnetcore:2.0 | microsoft/dotnet:2.1-aspnetcore-runtime |
microsoft/aspnetcore-build:2.0 | microsoft/dotnet:2.1-sdk |
Ändern Sie die Zeilen in Ihrer Dockerfile-Datei, um die FROM
neuen Bildnamen und Tags in der Spalte 2.1 der vorherigen Tabelle zu verwenden. Weitere Informationen finden Sie unter Migrieren von aspnetcore docker repos zu dotnet.
Änderungen zur Nutzung der neuen codebasierten Idiomen, die in ASP.NET Core 2.1 empfohlen werden
Änderungen am Main
Die folgenden Abbildungen zeigen die Änderungen, die an der generierten Vorlage vorgenommen Program.cs
wurden.
Die vorherige Abbildung zeigt die 2.0-Version mit den Löschungen rot.
Die folgende Abbildung zeigt den Code 2.1. Der Code in Grün ersetzte die Version 2.0:
Der folgende Code zeigt die Version 2.1 von 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>();
}
}
Der neue Main
ersetzt den Anruf durch BuildWebHost
CreateWebHostBuilder. IWebHostBuilder wurde hinzugefügt, um eine neue Integrationstestinfrastruktur zu unterstützen.
Änderungen am Start
Der folgende Code zeigt die Änderungen an der generierten 2.1-Vorlage. Alle Änderungen werden neu hinzugefügt, mit Ausnahme der UseBrowserLink
Entfernten:
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();
}
}
}
Die vorherigen Codeänderungen sind in:
- DSGVO-Unterstützung in ASP.NET Core für
CookiePolicyOptions
undUseCookiePolicy
. - HTTP Strict Transport Security Protocol (HSTS) für
UseHsts
. - HTTPS für
UseHttpsRedirection
. - SetCompatibilityVersion für
SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.
Änderungen am Authentifizierungscode
ASP.NET Core 2.1 stellt eine Razor Klassenbibliothek (Class Library, RCL) bereitASP.NET Core Identity.
Die Standard-Benutzeroberfläche 2.1 Identity bietet derzeit keine signifikanten neuen Features für die Version 2.0. Identity Das Ersetzen durch das RCL-Paket ist optional. Die Vorteile zum Ersetzen des generierten Identity Codes der Vorlage durch die RCL-Version umfassen:
- Viele Dateien werden aus der Quellstruktur verschoben.
- Alle Fehlerkorrekturen oder neuen Features, die Identity im Microsoft.AspNetCore.App Metapackage enthalten sind. Sie erhalten automatisch die Aktualisierung, wenn
Microsoft.AspNetCore.App
sie aktualisiert Identity wird.
Wenn Sie nicht triviale Änderungen am generierten Code der Vorlage vorgenommen Identity haben:
- Die vorstehenden Vorteile rechtfertigen wahrscheinlich nicht die Konvertierung in die RCL-Version.
- Sie können Ihren ASP.NET Core 2.0-Code Identity beibehalten, der vollständig unterstützt wird.
Identity 2.1 macht Endpunkte mit dem Identity
Bereich verfügbar. Die folgende Tabelle zeigt beispielsweise Beispiele für Identity Endpunkte, die sich von 2.0 bis 2.1 ändern:
2.0 URL | URL 2.1 |
---|---|
/Konto/Anmeldung | /Identity/Konto/Anmeldung |
/Konto/Abmelden | /Identity/Konto/Abmelden |
/Konto/Verwalten | /Identity/Konto/Verwalten |
Anwendungen, die Code verwenden Identity und die 2.0-Benutzeroberfläche Identity durch die 2.1-Bibliothek Identity ersetzen, müssen Identity die URLs /Identity
berücksichtigen, die segmentiert sind. Eine Möglichkeit zum Behandeln der neuen Identity Endpunkte besteht darin, Umleitungen einzurichten, z. B. von /Account/Login
zu /Identity/Account/Login
.
Aktualisieren Identity auf Version 2.1
Die folgenden Optionen stehen zur Aktualisierung Identity auf 2.1 zur Verfügung.
- Verwenden Sie den Identity UI 2.0-Code ohne Änderungen. Die Verwendung von Identity UI 2.0-Code wird vollständig unterstützt. Dies ist ein guter Ansatz, wenn erhebliche Änderungen an dem generierten Identity Code vorgenommen wurden.
- Löschen Sie Ihren vorhandenen Identity 2.0-Code und Ihr Gerüst Identity in Ihr Projekt. Ihr Projekt verwendet die ASP.NET Core IdentityRazor Klassenbibliothek. Sie können Code und Benutzeroberfläche für einen der Identity von Ihnen geänderten UI-Code generieren. Wenden Sie Ihre Codeänderungen auf den neu gerüsteten UI-Code an.
- Löschen Sie Ihren vorhandenen Identity 2.0-Code und Ihr Gerüst Identity in Ihr Projekt, mit der Option, alle Dateien außer Kraft zu setzen.
Ersetzen Sie Identity die Benutzeroberfläche 2.0 durch die Identity Klassenbibliothek 2.1 Razor
In diesem Abschnitt werden die Schritte beschrieben, um den generierten Identity Code ASP.NET Core 2.0 durch die ASP.NET Core IdentityRazor Klassenbibliothek zu ersetzen. Die folgenden Schritte gelten für ein Pages-Projekt, aber der Ansatz für ein Razor MVC-Projekt ist ähnlich.
- Überprüfen, ob die Projektdatei aktualisiert wird, um 2.1-Versionen zu verwenden
- Löschen Sie die folgenden Ordner und alle Dateien in diesen:
- Controller
- Seiten/Konto/
- Erweiterungen
- Erstellen Sie das Projekt.
- Gerüst Identity in Ihr Projekt:
- Wählen Sie die Projekte aus, die _Layout.cshtml-Datei beenden.
- Wählen Sie das + Symbol auf der rechten Seite der Datenkontextklasse aus. Akzeptieren Sie den Standardnamen.
- Wählen Sie "Hinzufügen " aus, um eine neue Datenkontextklasse zu erstellen. Das Erstellen eines neuen Datenkontexts ist für das Gerüst erforderlich. Sie entfernen den neuen Datenkontext im nächsten Abschnitt.
Aktualisieren nach dem Gerüst Identity
Löschen Sie das Gerüst, das Identity abgeleitete Klasse im Ordner "Bereiche//IdentityDaten" generiert hat
IdentityDbContext
.Löschen Sie
Areas/Identity/IdentityHostingStartup.cs
.Aktualisieren Sie die datei _LoginPartial.cshtml :
- Verschieben von Seiten/_LoginPartial.cshtml in Pages/Shared/_LoginPartial.cshtml.
- Fügen Sie dem Formular und den Ankerlinks hinzu
asp-area="Identity"
. - Aktualisieren des
<form />
Elements auf<form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
.
Der folgende Code zeigt die aktualisierte datei _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> }
Aktualisieren Sie ConfigureServices
mit folgendem Code:
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>();
}
Änderungen an Razor Seiten-Projektdateien Razor
Die Layoutdatei
Verschieben von Seiten/_Layout.cshtml in Pages/Shared/_Layout.cshtml
Ändern Sie
Layout = "/Pages/_Layout.cshtml"
sich in Bereichen//Seiten/Identity_ViewStart.cshtml inLayout = "/Pages/Shared/_Layout.cshtml"
.Die datei "_Layout.cshtml " weist die folgenden Änderungen auf:
<partial name="_CookieConsentPartial" />
wird hinzugefügt. Weitere Informationen finden Sie unter DSGVO-Unterstützung in ASP.NET Core.- jQuery ändert sich von 2.2.0 auf 3.3.1.
_ValidationScriptsPartial.cshtml
- Pages/_ValidationScriptsPartial.cshtml wechselt zu Pages/Shared/_ValidationScriptsPartial.cshtml.
- jquery.validate/1.14.0 änderungen an jquery.valid/1.17.0.
Neue Dateien
Die folgenden Dateien werden hinzugefügt:
Privacy.cshtml
Privacy.cshtml.cs
Weitere Informationen zu den vorherigen Dateien finden Sie unter der DSGVO-Unterstützung in ASP.NET Core.
Änderungen an MVC-Projektdateien Razor
Die Layoutdatei
Die Layout.cshtml
Datei weist die folgenden Änderungen auf:
<partial name="_CookieConsentPartial" />
wird hinzugefügt.- jQuery ändert sich von 2.2.0 auf 3.3.1
_ValidationScriptsPartial.cshtml
jquery.valid/1.14.0 Änderungen an jquery.valid/1.17.0
Neue Dateien und Aktionsmethoden
Die folgenden Elemente werden hinzugefügt:
Views/Home/Privacy.cshtml
- Die
Privacy
Aktionsmethode wird dem Home Controller hinzugefügt.
Weitere Informationen zu den vorherigen Dateien finden Sie unter der DSGVO-Unterstützung in ASP.NET Core.
Änderungen an der launchSettings.json-Datei
Da ASP.NET Core Apps jetzt HTTPS standardmäßig verwenden, hat sich die Properties/launchSettings.json
Datei geändert.
Die folgende JSON zeigt die frühere 2.0-Vorlage generierte launchSettings.json
Datei:
{
"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/"
}
}
}
Die folgende JSON zeigt die neue 2.1-Vorlage generierte launchSettings.json
Datei:
{
"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"
}
}
}
}
Weitere Informationen finden Sie unter Erzwingen von HTTPS in ASP.NET Core.
Aktuelle Änderungen
FileResult Range Header
FileResult Verarbeitet den Header "Accept-Ranges " nicht mehr standardmäßig. Um die Accept-Ranges
Kopfzeile zu aktivieren, legen Sie EnableRangeProcessing auf true
.
ControllerBase.File und PhysicalFile Range Header
Die folgenden ControllerBase Methoden verarbeiten standardmäßig nicht mehr den Header "Accept-Ranges ":
- Überladungen von ControllerBase.File
- ControllerBase.PhysicalFile
Um die Accept-Ranges
Kopfzeile zu aktivieren, legen Sie den EnableRangeProcessing
Parameter auf true
.
ASP.NET Core Modul (ANCM)
Wenn das ASP.NET Core Modul (ANCM) keine ausgewählte Komponente war, wenn Visual Studio installiert wurde oder eine vorherige Version des ANCM-Systems installiert wurde, laden Sie das neueste .NET Core Hosting Bundle Installer (direkte Download) herunter, und führen Sie das Installationsprogramm aus. Weitere Informationen finden Sie unter Hosting Bundle.