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.AllMicrosoft.AspNetCore.App. Möglicherweise müssen Sie Abhängigkeiten hinzufügen, die aus Microsoft.AspNetCore.Allentfernt 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)
  • 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 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:

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 an der Haupt

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

Alte Versionsunterschiede

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:

Neue Versionsunterschiede

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:

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

  • Die Datei "_Layout.cshtml " hat die folgenden Änderungen:

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

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.

Weitere Änderungen