Migrate from ASP.NET Core 2.0 to 2.1 (Migrieren von ASP.NET Core 2.0 zu 2.1)
Von Rick Anderson
Weitere Informationen finden Sie in ASP.NET Core 2.1 für eine Übersicht über die neuen Features in ASP.NET Core 2.1.
Dieser Artikel:
- Behandelt die Grundlagen der Migration einer ASP.NET Core 2.0-App zu 2.1.
- Stellt eine Übersicht über die Änderungen an den ASP.NET Core Webanwendungsvorlagen bereit.
Eine schnelle Möglichkeit zum Abrufen einer Übersicht über die Änderungen in 2.1 besteht darin:
- Erstellen Sie eine ASP.NET Core 2.0 Web App namens WebApp1.
- Commit des 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.
In diesem Artikel finden Sie 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 beim Erstellen und Ändern des Projekts ausgewählt wurden.
Aktualisieren der Projektdatei, damit sie die 2.1-Versionen verwendet
Aktualisieren sie die Projektdatei:
- Ändern Sie das Zielframework in .NET Core 2.1, indem Sie die Projektdatei auf
<TargetFramework>netcoreapp2.1</TargetFramework>
aktualisieren. - Ersetzen Sie den Paketverweis durch einen Paketverweis für
Microsoft.AspNetCore.All
Microsoft.AspNetCore.App
. Möglicherweise müssen Sie Abhängigkeiten hinzufügen, die ausMicrosoft.AspNetCore.All
entfernt 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" im Paketverweis auf
Microsoft.AspNetCore.App
. Projekte, die die Verwendung verwenden<Project Sdk="Microsoft.NET.Sdk.Web">
, müssen die Version nicht festlegen. Die Version wird vom Zielframework impliziert und ausgewählt, um die Funktionsweise ASP.NET Core 2.1 am besten zu vergleichen. 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 Razor von Dateien. Wenn Ihre App eingebettete Ansichten verwendet oder anderweitig auf die Laufzeitkompilierung von Razor Dateien basiert, fügen Sie
<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
eine<PropertyGroup>
In ihrer Projektdatei hinzu.
Das folgende Markup zeigt die von der 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 von der 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 von der Paketreferenz angegebene Version ist die mindest erforderliche Version. Ein Projekt, das beispielsweise auf die 2.1.1-Versionen dieser Pakete verweist, wird auf einem Computer mit nur der installierten 2.1.0-Laufzeit nicht ausgeführt.
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 verwendenMicrosoft.AspNetCore.All
Microsoft.AspNetCore.All
oderMicrosoft.AspNetCore.App
hinzufügen sollten.Beispiel:
MyApp
enthält einen Paketverweis aufMicrosoft.AspNetCore.App
.MyApp.Tests
hat einen Projektverweis aufMyApp.csproj
.
Fügen Sie einen Paketverweis für
Microsoft.AspNetCore.App
MyApp.Tests
. Weitere Informationen finden Sie unter Integrationstests, die nicht eingerichtet werden können, und können die Wartung von freigegebenen Frameworks unterbrechen.
Aktualisieren auf die Docker-Images von 2.1
In ASP.NET Core 2.1 migrierten Docker-Images zum dotnet/dotnet-docker GitHub-Repository. Die folgende Tabelle zeigt die Docker-Bild- und Tagänderungen:
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, um die neuen codebasierten Idioms zu nutzen, die in ASP.NET Core 2.1 empfohlen werden
Änderungen an der Haupt
Die folgenden Bilder zeigen die Änderungen, die an der generierten Program.cs
Vorlage vorgenommen wurden.
Das vorherige Bild zeigt die 2.0-Version mit den Löschvorgängen in Rot.
Das folgende Bild 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 BuildWebHost
durch CreateWebHostBuilder. IWebHostBuilder Wurde hinzugefügt, um eine neue Integrationstestinfrastruktur zu unterstützen.
Änderungen am Start
Der folgende Code zeigt die Änderungen an der generierten Vorlage 2.1. Alle Änderungen werden neu hinzugefügt, außer dies UseBrowserLink
wurde entfernt:
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
. - Benötigen Sie HTTPS für
UseHttpsRedirection
. - SetCompatibilityVersion für
SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.
Änderungen an Authentifizierungscode
ASP.NET Core 2.1 stellt ASP.NET Core Identity als Razor Klassenbibliothek (RCL) bereit.
Die Standard-Benutzeroberfläche 2.1 Identity bietet derzeit keine signifikanten neuen Features über die 2.0-Version. Identity Das Ersetzen durch das RCL-Paket ist optional. Die Vorteile zum Ersetzen des generierten Identity Codes durch die RCL-Version umfassen:
- Viele Dateien werden aus Der Quellstruktur verschoben.
- Alle Fehlerkorrekturen oder neue 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 an der generierten Identity Vorlage vorgenommen haben:
- Die vorhergehenden Vorteile rechtfertigen wahrscheinlich nicht die Konvertierung in die RCL-Version.
- Sie können Ihren ASP.NET Core 2.0-Code Identity beibehalten, es wird vollständig unterstützt.
Identity 2.1 macht Endpunkte mit dem Identity
Bereich verfügbar. Die folgende Tabelle zeigt beispielsweise Beispiele für Identity Endpunkte, die von 2.0 zu 2.1 geändert werden:
2.0 URL | URL 2.1 |
---|---|
/Account/Login | /Identity/Konto/Anmeldung |
/Account/Abmelden | /Identity/Konto/Abmelden |
/Account/Manage | /Identity/Account/Manage |
Anwendungen, die Code verwenden Identity und ersetzen 2.0 Identity UI durch die 2.1-Bibliothek Identity müssen berücksichtigen, dass Identity URLs /Identity
segmentvoreingestellt 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 zum Aktualisieren 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 am generierten Identity Code vorgenommen wurden.
- Löschen Sie den vorhandenen Identity 2.0-Code und den Gerüst in Identity Ihr Projekt. Ihr Projekt verwendet die ASP.NET Core IdentityRazor Klassenbibliothek. Sie können Code und UI für einen beliebigen Identity von Ihnen geänderten UI-Code generieren. Wenden Sie Ihre Codeänderungen auf den neu gerüsteten UI-Code an.
- Löschen Sie Den vorhandenen Identity 2.0-Code und das Gerüst Identity in Ihr Projekt, mit der Option, alle Dateien außer Kraft zu setzen.
Ersetzen Der Identity Benutzeroberfläche 2.0 durch die Identity Klassenbibliothek 2.1 Razor
In diesem Abschnitt werden die Schritte zum Ersetzen der generierten ASP.NET Core 2.0-Vorlage durch den ASP.NET Core IdentityRazor Klassenbibliothek beschriebenIdentity. Die folgenden Schritte gelten für ein Razor Pages-Projekt, aber der Ansatz für ein 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 darin enthaltenen Dateien:
- 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 Data-Kontextklasse 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 "Areas/Identity/Data/" generiert
IdentityDbContext
hat.Löschen Sie
Areas/Identity/IdentityHostingStartup.cs
.Aktualisieren Sie die Datei "_LoginPartial.cshtml ":
- Verschieben von Seiten/_LoginPartial.cshtml auf "Pages/Shared/_LoginPartial.cshtml".
- Fügen Sie dem Formular und den Verankerungslinks 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 Seitenprojektdateien Razor
Die Layoutdatei
Verschieben von Seiten/_Layout.cshtml auf "Pages/Shared/_Layout.cshtml"
Ändern Sie
Layout = "/Pages/_Layout.cshtml"
sich in Areas//IdentityPages/_ViewStart.cshtml inLayout = "/Pages/Shared/_Layout.cshtml"
.Die Datei "_Layout.cshtml " hat die folgenden Änderungen:
<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 zu 3.3.1.
_ValidationScriptsPartial.cshtml
- Pages/_ValidationScriptsPartial.cshtml wechselt zu Pages/Shared/_ValidationScriptsPartial.cshtml.
- jquery.validate/1.14.0 änderungen an jquery.validate/1.17.0.
Neue Dateien
Die folgenden Dateien werden hinzugefügt:
Privacy.cshtml
Privacy.cshtml.cs
Informationen zu den vorherigen Dateien finden Sie unter der DSGVO-Unterstützung in ASP.NET Core.
Änderungen an MVC-Projektendateien Razor
Die Layoutdatei
Die Layout.cshtml
Datei hat die folgenden Änderungen:
<partial name="_CookieConsentPartial" />
wird hinzugefügt.- jQuery ändert sich von 2.2.0 zu 3.3.1
_ValidationScriptsPartial.cshtml
jquery.validate/1.14.0 änderungen an jquery.validate/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.
Informationen zu den vorherigen Dateien finden Sie unter der DSGVO-Unterstützung in ASP.NET Core.
Änderungen an der datei "launchSettings.json"
Da ASP.NET Core Apps jetzt standardmäßig HTTPS 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/"
}
}
}
The following JSON shows the new 2.1 template-generated launchSettings.json
file:
{
"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 Der Header "Accept-Ranges " wird standardmäßig nicht mehr verarbeitet. Um die Accept-Ranges
Kopfzeile zu aktivieren, legen Sie auf EnableRangeProcessingtrue
.
Header "ControllerBase.File" und "PhysicalFile Range"
Die folgenden ControllerBase Methoden verarbeitet den Header "Accept-Ranges " standardmäßig nicht mehr:
- Ü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 frühere Version des ANCM auf dem System installiert wurde, laden Sie das neueste .NET Core Hosting Bundle Installer (direct download) herunter, und führen Sie das Installationsprogramm aus. Weitere Informationen finden Sie unter Hosting-Bundle.