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ür Microsoft.AspNetCore.App. Möglicherweise müssen Sie Abhängigkeiten hinzufügen, die entfernt Microsoft.AspNetCore.Allwurden. 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)
  • 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ühren dotnet 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 mit Microsoft.AspNetCore.AllMicrosoft.AspNetCore.All oder Microsoft.AspNetCore.Appenthalten.

    Beispiel:

    • MyApp enthält einen Paketverweis auf Microsoft.AspNetCore.App.
    • MyApp.Tests weist einen Projektverweis auf MyApp.csproj.

    Fügen Sie einen Paketverweis für Microsoft.AspNetCore.AppMyApp.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 am Main

Die folgenden Abbildungen zeigen die Änderungen, die an der generierten Vorlage vorgenommen Program.cs wurden.

old version differences

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:

new version differences

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 BuildWebHostCreateWebHostBuilder. 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:

Ä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 hatIdentityDbContext.

  • 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 in Layout = "/Pages/Shared/_Layout.cshtml".

  • Die datei "_Layout.cshtml " weist die folgenden Änderungen auf:

_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 ":

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.

Weitere Änderungen