Migrer de ASP.NET Core 2,2 à 3,0Migrate from ASP.NET Core 2.2 to 3.0

Par Scott Addie et Rick AndersonBy Scott Addie and Rick Anderson

Cet article explique comment mettre à jour un projet ASP.NET Core 2,2 existant vers ASP.NET Core 3,0.This article explains how to update an existing ASP.NET Core 2.2 project to ASP.NET Core 3.0.

Configuration requisePrerequisites

Mettre à jour la version du SDK .NET Core dans global.jsonUpdate .NET Core SDK version in global.json

Si votre solution repose sur un fichier global. JSON pour cibler une version spécifique de kit SDK .net Core, mettez à jour sa propriété version sur la version 3,0 installée sur votre ordinateur :If your solution relies upon a global.json file to target a specific .NET Core SDK version, update its version property to the 3.0 version installed on your machine:

{
  "sdk": {
    "version": "3.0.100"
  }
}

Mettre à jour le fichier projetUpdate the project file

Mettre à jour la version cible de .NET FrameworkUpdate the Target Framework

ASP.NET Core 3,0 et versions ultérieures s’exécutent uniquement sur .NET Core.ASP.NET Core 3.0 and later only run on .NET Core. Définissez le moniker du Framework cible (TFM) sur netcoreapp3.0 :Set the Target Framework Moniker (TFM) to netcoreapp3.0:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

Supprimer les références de package obsolètesRemove obsolete package references

ASP.NET Core ne produit plus un grand nombre de fonctionnalités de packages NuGet.ASP.NET Core no longer produces a large number of NuGet packages features. Ces références de package doivent être supprimées de votre fichier projet.These package references should be removed from your project file. Par exemple, le fichier projet généré par modèle pour une application Web ASP.NET Core 2,2 :For example, the template-generated project file for an ASP.NET Core 2.2 web app:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>


  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

Fichier de projet ASP.NET Core 3,0 mis à jour :The updated ASP.NET Core 3.0 project file:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

Fichier de projet ASP.NET Core 3,0 mis à jour :The updated ASP.NET Core 3.0 project file:

  • Dans la <PropertyGroup> :In the <PropertyGroup>:

    • Met à jour TFM sur netcoreapp3.0Updates the TFM to netcoreapp3.0
    • Supprime l’élément <AspNetCoreHostingModel>.Removes the <AspNetCoreHostingModel> element. Pour plus d’informations, consultez modèle d’hébergement in-process dans ce document.For more information, see In-process hosting model in this document.
  • Dans la <ItemGroup> :In the <ItemGroup>:

    • Microsoft.AspNetCore.App est supprimé.Microsoft.AspNetCore.App is removed. Pour plus d’informations, consultez Référence de l' infrastructure dans ce document.For more information, see Framework reference in this document.
    • Microsoft.AspNetCore.Razor.Design est supprimée et la liste suivante de packages n’est plus produite.Microsoft.AspNetCore.Razor.Design is removed and in the following list of packages no longer being produced.

Pour afficher la liste complète des packages qui ne sont plus produits, sélectionnez la liste de développement suivante :To see the full list of packages that are no longer produced, select the following expand list:

Cliquez ici pour développer la liste des packages qui ne sont plus produitsClick here to expand the list of packages no longer being produced
  • Microsoft.AspNetCoreMicrosoft.AspNetCore
  • Microsoft.AspNetCore.AllMicrosoft.AspNetCore.All
  • Microsoft.AspNetCore.AppMicrosoft.AspNetCore.App
  • Microsoft.AspNetCore.AntiforgeryMicrosoft.AspNetCore.Antiforgery
  • Microsoft.AspNetCore.AuthenticationMicrosoft.AspNetCore.Authentication
  • Microsoft.AspNetCore.Authentication.AbstractionsMicrosoft.AspNetCore.Authentication.Abstractions
  • Microsoft.AspNetCore.Authentication.CookiesMicrosoft.AspNetCore.Authentication.Cookies
  • Microsoft.AspNetCore.Authentication.CoreMicrosoft.AspNetCore.Authentication.Core
  • Microsoft.AspNetCore.Authentication.JwtBearerMicrosoft.AspNetCore.Authentication.JwtBearer
  • Microsoft.AspNetCore.Authentication.OAuthMicrosoft.AspNetCore.Authentication.OAuth
  • Microsoft.AspNetCore.Authentication.OpenIdConnectMicrosoft.AspNetCore.Authentication.OpenIdConnect
  • Microsoft.AspNetCore.AuthorizationMicrosoft.AspNetCore.Authorization
  • Microsoft.AspNetCore.Authorization.PolicyMicrosoft.AspNetCore.Authorization.Policy
  • Microsoft.AspNetCore.CookiePolicyMicrosoft.AspNetCore.CookiePolicy
  • Microsoft.AspNetCore.CorsMicrosoft.AspNetCore.Cors
  • Microsoft.AspNetCore.Cryptography.InternalMicrosoft.AspNetCore.Cryptography.Internal
  • Microsoft.AspNetCore.Cryptography.KeyDerivationMicrosoft.AspNetCore.Cryptography.KeyDerivation
  • Microsoft.AspNetCore.DataProtectionMicrosoft.AspNetCore.DataProtection
  • Microsoft.AspNetCore.DataProtection.AbstractionsMicrosoft.AspNetCore.DataProtection.Abstractions
  • Microsoft.AspNetCore.DataProtection.ExtensionsMicrosoft.AspNetCore.DataProtection.Extensions
  • Microsoft.AspNetCore.DiagnosticsMicrosoft.AspNetCore.Diagnostics
  • Microsoft.AspNetCore.Diagnostics.HealthChecksMicrosoft.AspNetCore.Diagnostics.HealthChecks
  • Microsoft.AspNetCore.HostFilteringMicrosoft.AspNetCore.HostFiltering
  • Microsoft.AspNetCore.HostingMicrosoft.AspNetCore.Hosting
  • Microsoft.AspNetCore.Hosting.AbstractionsMicrosoft.AspNetCore.Hosting.Abstractions
  • Microsoft.AspNetCore.Hosting.Server.AbstractionsMicrosoft.AspNetCore.Hosting.Server.Abstractions
  • Microsoft.AspNetCore.HttpMicrosoft.AspNetCore.Http
  • Microsoft.AspNetCore.Http.AbstractionsMicrosoft.AspNetCore.Http.Abstractions
  • Microsoft.AspNetCore.Http.ConnectionsMicrosoft.AspNetCore.Http.Connections
  • Microsoft.AspNetCore.Http.ExtensionsMicrosoft.AspNetCore.Http.Extensions
  • Microsoft.AspNetCore.Http.FeaturesMicrosoft.AspNetCore.Http.Features
  • Microsoft.AspNetCore.HttpOverridesMicrosoft.AspNetCore.HttpOverrides
  • Microsoft.AspNetCore.HttpsPolicyMicrosoft.AspNetCore.HttpsPolicy
  • Microsoft.AspNetCore.IdentityMicrosoft.AspNetCore.Identity
  • Microsoft.AspNetCore.LocalizationMicrosoft.AspNetCore.Localization
  • Microsoft.AspNetCore.Localization.RoutingMicrosoft.AspNetCore.Localization.Routing
  • Microsoft.AspNetCore.MiddlewareAnalysisMicrosoft.AspNetCore.MiddlewareAnalysis
  • Microsoft.AspNetCore.MvcMicrosoft.AspNetCore.Mvc
  • Microsoft.AspNetCore.Mvc.AbstractionsMicrosoft.AspNetCore.Mvc.Abstractions
  • Microsoft.AspNetCore.Mvc.AnalyzersMicrosoft.AspNetCore.Mvc.Analyzers
  • Microsoft.AspNetCore.Mvc.ApiExplorerMicrosoft.AspNetCore.Mvc.ApiExplorer
  • Microsoft.AspNetCore.Mvc.Api.AnalyzersMicrosoft.AspNetCore.Mvc.Api.Analyzers
  • Microsoft.AspNetCore.Mvc.CoreMicrosoft.AspNetCore.Mvc.Core
  • Microsoft.AspNetCore.Mvc.CorsMicrosoft.AspNetCore.Mvc.Cors
  • Microsoft.AspNetCore.Mvc.DataAnnotationsMicrosoft.AspNetCore.Mvc.DataAnnotations
  • Microsoft.AspNetCore.Mvc.Formatters.JsonMicrosoft.AspNetCore.Mvc.Formatters.Json
  • Microsoft.AspNetCore.Mvc.Formatters.XmlMicrosoft.AspNetCore.Mvc.Formatters.Xml
  • Microsoft.AspNetCore.Mvc.LocalizationMicrosoft.AspNetCore.Mvc.Localization
  • Microsoft.AspNetCore.Mvc.RazorMicrosoft.AspNetCore.Mvc.Razor
  • Microsoft.AspNetCore.Mvc.Razor.ExtensionsMicrosoft.AspNetCore.Mvc.Razor.Extensions
  • Microsoft.AspNetCore.Mvc.Razor.ViewCompilationMicrosoft.AspNetCore.Mvc.Razor.ViewCompilation
  • Microsoft.AspNetCore.Mvc.RazorPagesMicrosoft.AspNetCore.Mvc.RazorPages
  • Microsoft.AspNetCore.Mvc.TagHelpersMicrosoft.AspNetCore.Mvc.TagHelpers
  • Microsoft.AspNetCore.Mvc.ViewFeaturesMicrosoft.AspNetCore.Mvc.ViewFeatures
  • Microsoft.AspNetCore.RazorMicrosoft.AspNetCore.Razor
  • Microsoft.AspNetCore.Razor.RuntimeMicrosoft.AspNetCore.Razor.Runtime
  • Microsoft.AspNetCore.Razor.DesignMicrosoft.AspNetCore.Razor.Design
  • Microsoft.AspNetCore.ResponseCachingMicrosoft.AspNetCore.ResponseCaching
  • Microsoft.AspNetCore.ResponseCaching.AbstractionsMicrosoft.AspNetCore.ResponseCaching.Abstractions
  • Microsoft.AspNetCore.ResponseCompressionMicrosoft.AspNetCore.ResponseCompression
  • Microsoft.AspNetCore.RewriteMicrosoft.AspNetCore.Rewrite
  • Microsoft.AspNetCore.RoutingMicrosoft.AspNetCore.Routing
  • Microsoft.AspNetCore.Routing.AbstractionsMicrosoft.AspNetCore.Routing.Abstractions
  • Microsoft.AspNetCore.Server.HttpSysMicrosoft.AspNetCore.Server.HttpSys
  • Microsoft.AspNetCore.Server.IISMicrosoft.AspNetCore.Server.IIS
  • Microsoft.AspNetCore.Server.IISIntegrationMicrosoft.AspNetCore.Server.IISIntegration
  • Microsoft.AspNetCore.Server.KestrelMicrosoft.AspNetCore.Server.Kestrel
  • Microsoft.AspNetCore.Server.Kestrel.CoreMicrosoft.AspNetCore.Server.Kestrel.Core
  • Microsoft.AspNetCore.Server.Kestrel.HttpsMicrosoft.AspNetCore.Server.Kestrel.Https
  • Microsoft.AspNetCore.Server.Kestrel.Transport.AbstractionsMicrosoft.AspNetCore.Server.Kestrel.Transport.Abstractions
  • Microsoft.AspNetCore.Server.Kestrel.Transport.SocketsMicrosoft.AspNetCore.Server.Kestrel.Transport.Sockets
  • Microsoft.AspNetCore.SessionMicrosoft.AspNetCore.Session
  • Microsoft. AspNetCore.SignalRMicrosoft.AspNetCore.SignalR
  • Microsoft. AspNetCore.SignalR. EbaucheMicrosoft.AspNetCore.SignalR.Core
  • Microsoft.AspNetCore.StaticFilesMicrosoft.AspNetCore.StaticFiles
  • Microsoft.AspNetCore.WebSocketsMicrosoft.AspNetCore.WebSockets
  • Microsoft.AspNetCore.WebUtilitiesMicrosoft.AspNetCore.WebUtilities
  • Microsoft.Net. http. en-têtesMicrosoft.Net.Http.Headers

Examiner les modifications avec ruptureReview breaking changes

Examiner les modifications avec ruptureReview breaking changes

Référence du FrameworkFramework reference

Les fonctionnalités de ASP.NET Core qui étaient disponibles via l’un des packages répertoriés ci-dessus sont disponibles dans le cadre du Microsoft.AspNetCore.App Framework partagé.Features of ASP.NET Core that were available through one of the packages listed above are available as part of the Microsoft.AspNetCore.App shared framework. L' infrastructure partagée est l’ensemble d’assemblys (fichiers . dll ) qui sont installés sur l’ordinateur et qui comprend un composant d’exécution et un pack de ciblage.The shared framework is the set of assemblies (.dll files) that are installed on the machine and includes a runtime component, and a targeting pack. Pour plus d’informations, consultez Le framework partagé.For more information, see The shared framework.

  • Les projets qui ciblent le kit de développement logiciel (SDK) Microsoft.NET.Sdk.Web référencent implicitement l’infrastructure Microsoft.AspNetCore.App.Projects that target the Microsoft.NET.Sdk.Web SDK implicitly reference the Microsoft.AspNetCore.App framework.

    Aucune référence supplémentaire n’est requise pour ces projets :No additional references are required for these projects:

    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
      </PropertyGroup>
        ...
    </Project>
    
  • Les projets qui ciblent Microsoft.NET.Sdk ou Microsoft.NET.Sdk.Razor SDK doivent ajouter un FrameworkReference explicite à Microsoft.AspNetCore.App :Projects that target Microsoft.NET.Sdk or Microsoft.NET.Sdk.Razor SDK, should add an explicit FrameworkReference to Microsoft.AspNetCore.App:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
      </ItemGroup>
        ...
    </Project>
    

Builds dépendantes du Framework utilisant l’ancrageFramework-dependent builds using Docker

Les builds dépendantes du Framework des applications console qui utilisent un package qui dépend de l' infrastructure partagée ASP.net Core peuvent fournir l’erreur d’exécution suivante :Framework-dependent builds of console apps that use a package that depends on the ASP.NET Core shared framework may give the following runtime error:

It was not possible to find any compatible framework version
The specified framework 'Microsoft.AspNetCore.App', version '3.0.0' was not found.
  - No frameworks were found.

Microsoft.AspNetCore.App est l’infrastructure partagée contenant le runtime ASP.NET Core et est uniquement présente sur l’image de l’ancrage dotnet/Core/ASPNET .Microsoft.AspNetCore.App is the shared framework containing the ASP.NET Core runtime and is only present on the dotnet/core/aspnet docker image. Le kit de développement logiciel (SDK) 3,0 réduit la taille des builds dépendantes de l’infrastructure à l’aide de asp.net core en n’incluant pas de copies en double des bibliothèques disponibles dans le Framework partagé.The 3.0 SDK reduces the size of framework dependent builds using asp.net core by not including duplicate copies of libraries that are available in the shared framework. Il s’agit d’une économie potentielle pouvant atteindre 18 Mo, mais exige que le runtime ASP.NET Core soit présent/installé pour exécuter l’application.This is a potential savings of up to 18 MB but it requires that the ASP.NET Core runtime must be present / installed to run the app.

Pour déterminer si l’application a une dépendance (directe ou indirecte) sur le ASP.NET Core Framework partagé, examinez le fichier runtimeconfig. JSON généré pendant une génération/publication de votre application.To determine if the app has a dependency (either direct or indirect) on the ASP.NET Core shared framework, examine the runtimeconfig.json file generated during a build/publish of your app. Le fichier JSON suivant illustre une dépendance sur le ASP.NET Core Framework partagé :The following JSON file shows a dependency on the ASP.NET Core shared framework:

{
  "runtimeOptions": {
    "tfm": "netcoreapp3.0",
    "framework": {
      "name": "Microsoft.AspNetCore.App",
      "version": "3.0.0"
    },
    "configProperties": {
      "System.GC.Server": true
    }
  }
}

Si votre application utilise la station d’accueil, utilisez une image de base qui comprend ASP.NET Core 3,0.If your app is using docker, use a base image that includes ASP.NET Core 3.0. Par exemple, docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0.For example, docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0.

Ajouter des références de package pour les assemblys supprimésAdd package references for removed assemblies

ASP.NET Core 3,0 supprime certains assemblys qui faisaient auparavant partie de la référence de package Microsoft.AspNetCore.App.ASP.NET Core 3.0 removes some assemblies that were previously part of the Microsoft.AspNetCore.App package reference. Pour continuer à utiliser les fonctionnalités fournies par ces assemblys, référencez les versions 3,0 des packages correspondants :To continue using features provided by these assemblies, reference the 3.0 versions of the corresponding packages:

Modifications au démarrageStartup changes

L’illustration suivante montre les lignes supprimées et modifiées dans une application Web ASP.NET Core 2,2 Razor Pages :The following image shows the deleted and changed lines in an ASP.NET Core 2.2 Razor Pages Web app:

lignes supprimées et modifiées dans une application Web Razor ASP.NET Core 2,2

Dans l’image précédente, le code supprimé est affiché en rouge.In the preceding image, deleted code is shown in red. Le code supprimé n’affiche pas le code des options de cookie, qui a été supprimé avant la comparaison des fichiers.The deleted code doesn't show cookie options code, which was deleted prior to comparing the files.

L’illustration suivante montre les lignes ajoutées et modifiées dans une application Web ASP.NET Core 3,0 Razor Pages :The following image shows the added and changed lines in an ASP.NET Core 3.0 Razor Pages Web app:

lignes ajoutées et modifiées dans une application Web Razor ASP.NET Core 3,0

Dans l’image précédente, le code ajouté est affiché en vert.In the preceding image, added code is shown in green. Pour plus d’informations sur les modifications suivantes :For information on the following changes:

Prise en charge de l’analyseurAnalyzer support

Les projets qui ciblent des analyseurs de référence Microsoft.NET.Sdk.Web de manière implicite ont été fournis précédemment dans le cadre du package Microsoft. AspNetCore. Mvc. Analysis .Projects that target Microsoft.NET.Sdk.Web implicitly reference analyzers previously shipped as part of the Microsoft.AspNetCore.Mvc.Analyzers package. Aucune référence supplémentaire n’est requise pour les activer.No additional references are required to enable these.

Si votre application utilise des analyseurs d’API livrés précédemment à l’aide du package Microsoft. AspNetCore. Mvc. API. Analyzers , modifiez votre fichier projet pour référencer les analyseurs fournis dans le cadre du kit de développement logiciel (SDK) Web .net Core :If your app uses API analyzers previously shipped using the Microsoft.AspNetCore.Mvc.Api.Analyzers package, edit your project file to reference the analyzers shipped as part of the .NET Core Web SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <IncludeOpenAPIAnalyzers>true</IncludeOpenAPIAnalyzers>
    </PropertyGroup>

    ...
</Project>

Bibliothèque de classes RazorRazor Class Library

Les projets de bibliothèque de classes Razor qui fournissent des composants d’interface utilisateur pour MVC doivent définir la propriété AddRazorSupportForMvc dans le fichier projet :Razor Class Library projects that provide UI components for MVC must set the AddRazorSupportForMvc property in the project file:

<PropertyGroup>
  <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>

Modèle d’hébergement in-processIn-process hosting model

Les projets sont par défaut du modèle d’hébergement in-process dans ASP.net Core 3,0 ou version ultérieure.Projects default to the in-process hosting model in ASP.NET Core 3.0 or later. Vous pouvez éventuellement supprimer la propriété <AspNetCoreHostingModel> dans le fichier projet si sa valeur est InProcess.You may optionally remove the <AspNetCoreHostingModel> property in the project file if its value is InProcess.

KestrelKestrel

ConfigurationConfiguration

Migrer la configuration Kestrel vers le générateur d’hôte Web fourni par ConfigureWebHostDefaults (Program.cs) :Migrate Kestrel configuration to the web host builder provided by ConfigureWebHostDefaults (Program.cs):

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseStartup<Startup>();
        });

Si l’application crée l’hôte manuellement avec HostBuilder, appelez UseKestrel sur le générateur d’hôte Web dans ConfigureWebHostDefaults :If the app creates the host manually with HostBuilder, call UseKestrel on the web host builder in ConfigureWebHostDefaults:

public static void Main(string[] args)
{
    var host = new HostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseIISIntegration()
            .UseStartup<Startup>();
        })
        .Build();

    host.Run();
}

L’intergiciel de connexion remplace les adaptateurs de connexionConnection Middleware replaces Connection Adapters

Les adaptateurs de connexion (Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter) ont été supprimés de Kestrel.Connection Adapters (Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter) have been removed from Kestrel. Remplacer les adaptateurs de connexion par un intergiciel de connexion.Replace Connection Adapters with Connection Middleware. L’intergiciel de connexion est similaire à l’intergiciel (middleware) HTTP dans le pipeline ASP.NET Core, mais pour les connexions de niveau inférieur.Connection Middleware is similar to HTTP Middleware in the ASP.NET Core pipeline but for lower-level connections. Journalisation HTTPs et connexion :HTTPS and connection logging:

  • Ont été déplacés des adaptateurs de connexion vers l’intergiciel de connexion.Have been moved from Connection Adapters to Connection Middleware.
  • Ces méthodes d’extension fonctionnent comme dans les versions précédentes de ASP.NET Core.These extension methods work as in previous versions of ASP.NET Core.

Pour plus d’informations, consultez l’exemple TlsFilterConnectionHandler dans la section ListenOptions. Protocols de l’article Kestrel.For more information, see the TlsFilterConnectionHandler example in the ListenOptions.Protocols section of the Kestrel article.

Abstractions de transport déplacées et rendues publiquesTransport abstractions moved and made public

La couche de transport Kestrel a été exposée en tant qu’interface publique dans Connections.Abstractions.The Kestrel transport layer has been exposed as a public interface in Connections.Abstractions. Dans le cadre de ces mises à jour :As part of these updates:

  • Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions et les types associés ont été supprimés.Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions and associated types have been removed.
  • NoDelay a été déplacé de ListenOptions vers les options de transport.NoDelay was moved from ListenOptions to the transport options.
  • Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal.SchedulingMode a été supprimé de KestrelServerOptions.Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal.SchedulingMode was removed from KestrelServerOptions.

Pour plus d’informations, consultez les ressources GitHub suivantes :For more information, see the following GitHub resources:

En-têtes de la demande KestrelKestrel Request trailer headers

Pour les applications qui ciblent des versions antérieures de ASP.NET Core :For apps that target earlier versions of ASP.NET Core:

  • Kestrel ajoute des en-têtes de code de fin en bloc HTTP/1.1 dans la collection d’en-têtes de demande.Kestrel adds HTTP/1.1 chunked trailer headers into the request headers collection.
  • Les codes de fin sont disponibles une fois que le corps de la demande est lu jusqu’à la fin.Trailers are available after the request body is read to the end.

Cela pose des problèmes d’ambiguïté entre les en-têtes et les codes de fin, de sorte que les codes de fin ont été déplacés vers une nouvelle collection (RequestTrailerExtensions) dans 3,0.This causes some concerns about ambiguity between headers and trailers, so the trailers have been moved to a new collection (RequestTrailerExtensions) in 3.0.

Les codes de fin de requête HTTP/2 sont :HTTP/2 request trailers are:

  • Non disponible dans ASP.NET Core 2,2.Not available in ASP.NET Core 2.2.
  • Disponible dans 3,0 en tant que RequestTrailerExtensions.Available in 3.0 as RequestTrailerExtensions.

De nouvelles méthodes d’extension de demande sont présentes pour accéder à ces codes de fin.New request extension methods are present to access these trailers. Comme avec HTTP/1.1, les codes de fin sont disponibles une fois que le corps de la demande est lu jusqu’à la fin.As with HTTP/1.1, trailers are available after the request body is read to the end.

Pour la version 3,0, les méthodes RequestTrailerExtensions suivantes sont disponibles :For the 3.0 release, the following RequestTrailerExtensions methods are available:

  • GetDeclaredTrailers – obtient l’en-tête Request Trailer qui répertorie les codes de fin à attendre après le corps.GetDeclaredTrailers – Gets the request Trailer header that lists which trailers to expect after the body.
  • SupportsTrailers – indique si la demande prend en charge la réception des en-têtes de code de fin.SupportsTrailers – Indicates if the request supports receiving trailer headers.
  • CheckTrailersAvailable – vérifie si la demande prend en charge les codes de fin et s’ils sont disponibles pour la lecture.CheckTrailersAvailable – Checks if the request supports trailers and if they're available to be read. Cette vérification ne suppose pas qu’il y a des codes de fin à lire.This check doesn't assume that there are trailers to read. Il se peut qu’il n’y ait aucune remorque à lire même si true est retourné par cette méthode.There might be no trailers to read even if true is returned by this method.
  • GetTrailer – obtient l’en-tête de fin demandé de la réponse.GetTrailer – Gets the requested trailing header from the response. Vérifiez SupportsTrailers avant d’appeler GetTrailer, ou un NotSupportedException peut se produire si la requête ne prend pas en charge les en-têtes de fin.Check SupportsTrailers before calling GetTrailer, or a NotSupportedException may occur if the request doesn't support trailing headers.

Pour plus d’informations, consultez put Request queues in a distinct collection (ASPNET/AspNetCore #10410).For more information, see Put request trailers in a separate collection (aspnet/AspNetCore #10410).

AllowSynchronousIO désactivéAllowSynchronousIO disabled

AllowSynchronousIO active ou désactive les API d’e/s synchrones, telles que HttpRequest.Body.Read, HttpResponse.Body.Write et Stream.Flush.AllowSynchronousIO enables or disables synchronous IO APIs, such as HttpRequest.Body.Read, HttpResponse.Body.Write, and Stream.Flush. Ces API sont une source de privation de thread conduisant à des blocages d’application.These APIs are a source of thread starvation leading to app crashes. Dans 3,0, AllowSynchronousIO est désactivé par défaut.In 3.0, AllowSynchronousIO is disabled by default. Pour plus d’informations, consultez la section e/s synchrone dans l’article Kestrel.For more information, see the Synchronous IO section in the Kestrel article.

Si des e/s synchrones sont nécessaires, vous pouvez les activer en configurant l’option AllowSynchronousIO sur le serveur utilisé (lors de l’appel de ConfigureKestrel, par exemple, si vous utilisez Kestrel).If synchronous IO is needed, it can be enabled by configuring the AllowSynchronousIO option on the server being used (when calling ConfigureKestrel, for example, if using Kestrel). Notez que les serveurs (Kestrel, HttpSys, TestServer, etc.) ont leur propre AllowSynchronousIO option qui n’affectera pas les autres serveurs.Note that servers (Kestrel, HttpSys, TestServer, etc.) all have their own AllowSynchronousIO option which won't affect other servers. Les e/s synchrones peuvent être activées pour tous les serveurs par demande à l’aide de l’option IHttpBodyControlFeature.AllowSynchronousIO :Synchronous IO can be enabled for all servers on a per-request basis using the IHttpBodyControlFeature.AllowSynchronousIO option:

var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();

if (syncIOFeature != null)
{
    syncIOFeature.AllowSynchronousIO = true;
}

Si vous rencontrez des problèmes avec les implémentations de TextWriter ou d’autres flux qui appellent des API synchrones dans dispose, appelez plutôt la nouvelle API DisposeAsync.If you have trouble with TextWriter implementations or other streams that call synchronous APIs in Dispose, call the new DisposeAsync API instead.

Pour plus d’informations, consultez [Announcement] AllowSynchronousIO disabled in All Servers (ASPNET/AspNetCore #7644).For more information, see [Announcement] AllowSynchronousIO disabled in all servers (aspnet/AspNetCore #7644).

Assembly Microsoft. AspNetCore. Server. Kestrel. https suppriméMicrosoft.AspNetCore.Server.Kestrel.Https assembly removed

Dans ASP.NET Core 2,1, le contenu de Microsoft. AspNetCore. Server. Kestrel. https. dll a été déplacé vers Microsoft. AspNetCore. Server. Kestrel. Core. dll.In ASP.NET Core 2.1, the contents of Microsoft.AspNetCore.Server.Kestrel.Https.dll were moved to Microsoft.AspNetCore.Server.Kestrel.Core.dll. Il s’agissait d’une mise à jour sans rupture utilisant des attributs TypeForwardedTo.This was a non-breaking update using TypeForwardedTo attributes. Pour 3,0, l’assembly vide Microsoft. AspNetCore. Server. Kestrel. https. dll et le package NuGet ont été supprimés.For 3.0, the empty Microsoft.AspNetCore.Server.Kestrel.Https.dll assembly and the NuGet package have been removed.

Les bibliothèques référençant Microsoft. AspNetCore. Server. Kestrel. https doivent mettre à jour les dépendances de ASP.NET Core à 2,1 ou une version ultérieure.Libraries referencing Microsoft.AspNetCore.Server.Kestrel.Https should update ASP.NET Core dependencies to 2.1 or later.

Les applications et les bibliothèques qui ciblent ASP.NET Core 2,1 ou version ultérieure doivent supprimer toutes les références directes au package Microsoft. AspNetCore. Server. Kestrel. https .Apps and libraries targeting ASP.NET Core 2.1 or later should remove any direct references to the Microsoft.AspNetCore.Server.Kestrel.Https package.

Support Json.NETJson.NET support

Dans le cadre du travail d' amélioration du ASP.net Core Framework partagé, JSON.net a été supprimé de la ASP.net Core Framework partagé.As part of the work to improve the ASP.NET Core shared framework, Json.NET has been removed from the ASP.NET Core shared framework.

La valeur par défaut pour ASP.NET Core est désormais System. Text. JSON, qui est une nouveauté de .net Core 3,0.The default for ASP.NET Core is now System.Text.Json, which is new in .NET Core 3.0. Envisagez d’utiliser System.Text.Json dans la mesure du possible.Consider using System.Text.Json when possible. Elle est très performante et ne nécessite pas de dépendance de bibliothèque supplémentaire.It's high-performance and doesn't require an additional library dependency. Toutefois, étant donné que System.Text.Json est nouveau, il est possible qu’il manque actuellement des fonctionnalités dont votre application a besoin.However, since System.Text.Json is new, it might currently be missing features that your app needs.

Votre application peut nécessiter une intégration Newtonsoft.Json si elle utilise des fonctionnalités spécifiques à Newtonsoft.Json telles que JsonPatch ou Converters, ou si elle met en forme des types spécifiques à Newtonsoft.Json.Your app may require Newtonsoft.Json integration if it uses Newtonsoft.Json-specific feature such as JsonPatch or converters or if it formats Newtonsoft.Json-specific types.

Pour utiliser Json.NET dans un projet ASP.NET Core 3,0 SignalR, consultez basculer vers Newtonsoft. JSON dans ce document.To use Json.NET in an ASP.NET Core 3.0 SignalR project, see Switch to Newtonsoft.Json in this document.

Pour utiliser Json.NET dans un projet ASP.NET Core 3,0 :To use Json.NET in an ASP.NET Core 3.0 project:

  • Ajoutez une référence de package à Microsoft.AspNetCore.Mvc.NewtonsoftJson.Add a package reference to Microsoft.AspNetCore.Mvc.NewtonsoftJson.

  • Mettez à jour Startup.ConfigureServices pour appeler AddNewtonsoftJson.Update Startup.ConfigureServices to call AddNewtonsoftJson.

    services.AddMvc()
        .AddNewtonsoftJson();
    

    AddNewtonsoftJson est compatible avec les nouvelles méthodes d’inscription de service MVC :AddNewtonsoftJson is compatible with the new MVC service registration methods:

    • AddRazorPages
    • AddControllersWithViews
    • AddControllers
    services.AddControllers()
        .AddNewtonsoftJson();
    

    Les paramètres Json.NET peuvent être définis dans l’appel à AddNewtonsoftJson :Json.NET settings can be set in the call to AddNewtonsoftJson:

    services.AddMvc()
        .AddNewtonsoftJson(options =>
               options.SerializerSettings.ContractResolver =
                  new CamelCasePropertyNamesContractResolver());
    

Inscription du service MVCMVC service registration

ASP.NET Core 3,0 ajoute de nouvelles options pour l’inscription des scénarios MVC dans Startup.ConfigureServices.ASP.NET Core 3.0 adds new options for registering MVC scenarios inside Startup.ConfigureServices.

Trois nouvelles méthodes d’extension de niveau supérieur liées aux scénarios MVC sur IServiceCollection sont disponibles.Three new top-level extension methods related to MVC scenarios on IServiceCollection are available. Les modèles utilisent ces nouvelles méthodes au lieu de AddMvc.Templates use these new methods instead of AddMvc. Toutefois, AddMvc continue à se comporter comme dans les versions précédentes.However, AddMvc continues to behave as it has in previous releases.

L’exemple suivant ajoute la prise en charge des contrôleurs et des fonctionnalités liées à l’API, mais pas aux vues ou aux pages.The following example adds support for controllers and API-related features, but not views or pages. Le modèle d’API utilise ce code :The API template uses this code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}

L’exemple suivant ajoute la prise en charge des contrôleurs, des fonctionnalités liées à l’API et des vues, mais pas des pages.The following example adds support for controllers, API-related features, and views, but not pages. Le modèle d’application Web (MVC) utilise ce code :The Web Application (MVC) template uses this code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
}

L’exemple suivant ajoute la prise en charge de Razor Pages et de la prise en charge minimale du contrôleur.The following example adds support for Razor Pages and minimal controller support. Le modèle d’application Web utilise ce code :The Web Application template uses this code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
}

Les nouvelles méthodes peuvent également être combinées.The new methods can also be combined. L’exemple suivant est équivalent à l’appel de AddMvc dans ASP.NET Core 2,2 :The following example is equivalent to calling AddMvc in ASP.NET Core 2.2:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();
}

Routage du code de démarrageRouting startup code

Si une application appelle UseMvc ou UseSignalR, migrez l’application vers le routage des points de terminaison , si possible.If an app calls UseMvc or UseSignalR, migrate the app to Endpoint Routing if possible. Pour améliorer la compatibilité du routage des points de terminaison avec les versions précédentes de MVC, nous avons rétabli certaines des modifications apportées à la génération d’URL introduites dans ASP.NET Core 2,2.To improve Endpoint Routing compatibility with previous versions of MVC, we've reverted some of the changes in URL generation introduced in ASP.NET Core 2.2. Si vous avez rencontré des problèmes lors de l’utilisation du routage de point de terminaison dans 2,2, attendez-vous à des améliorations de ASP.NET Core 3,0, avec les exceptions suivantes :If you experienced problems using Endpoint Routing in 2.2, expect improvements in ASP.NET Core 3.0 with the following exceptions:

  • Si l’application implémente IRouter ou hérite de Route, utilisez DynamicRouteValuesTransformer comme remplacement.If the app implements IRouter or inherits from Route, use DynamicRouteValuesTransformer as the replacement.

  • Si l’application accède directement à RouteData.Routers dans MVC pour analyser des URL, vous pouvez remplacer ceci par l’utilisation de LinkParser.ParsePathByEndpointName.If the app directly accesses RouteData.Routers inside MVC to parse URLs, you can replace this with use of LinkParser.ParsePathByEndpointName.

  • Définissez l’itinéraire avec un nom d’itinéraire.Define the route with a route name.

  • Utilisez LinkParser.ParsePathByEndpointName et transmettez le nom de l’itinéraire souhaité.Use LinkParser.ParsePathByEndpointName and pass in the desired route name.

Le routage des points de terminaison prend en charge les mêmes syntaxe de modèle d’itinéraire et fonctionnalités de création de modèle de routage que IRouter.Endpoint Routing supports the same route pattern syntax and route pattern authoring features as IRouter. Le routage des points de terminaison prend en charge IRouteConstraint.Endpoint Routing supports IRouteConstraint. Le routage des points de terminaison prend en charge [Route], [HttpGet]et les autres attributs de routage MVC.Endpoint routing supports [Route], [HttpGet], and the other MVC routing attributes.

Pour la plupart des applications, seul Startup nécessite des modifications.For most applications, only Startup requires changes.

Migrer Startup. configureMigrate Startup.Configure

Conseils généraux :General advice:

  • Ajoutez UseRouting.Add UseRouting.

  • Si l’application appelle UseStaticFiles, placez UseStaticFiles avant UseRouting.If the app calls UseStaticFiles, place UseStaticFiles before UseRouting.

  • Si l’application utilise des fonctionnalités d’authentification/d’autorisation, telles que AuthorizePage ou [Authorize], placez l’appel à UseAuthentication et UseAuthorization: after, UseRouting et UseCors, mais avant UseEndpoints:If the app uses authentication/authorization features such as AuthorizePage or [Authorize], place the call to UseAuthentication and UseAuthorization: after, UseRouting and UseCors, but before UseEndpoints:

    public void Configure(IApplicationBuilder app)
    {
      ...
    
      app.UseStaticFiles();
    
      app.UseRouting();
      app.UseCors();
    
      app.UseAuthentication();
      app.UseAuthorization();
    
      app.UseEndpoints(endpoints => {
         endpoints.MapControllers();
      });
    
  • Remplacez UseMvc ou UseSignalR par UseEndpoints.Replace UseMvc or UseSignalR with UseEndpoints.

  • Si l’application utilise des scénarios cors , tels que [EnableCors], placez l’appel à UseCors avant tout autre intergiciel qui utilise cors (par exemple, placez UseCors avant UseAuthentication, UseAuthorizationet UseEndpoints).If the app uses CORS scenarios, such as [EnableCors], place the call to UseCors before any other middleware that use CORS (for example, place UseCors before UseAuthentication, UseAuthorization, and UseEndpoints).

  • Remplacez IHostingEnvironment par IWebHostEnvironment et ajoutez une instruction using pour l’espace de noms Microsoft.Extensions.Hosting.Replace IHostingEnvironment with IWebHostEnvironment and add a using statement for the Microsoft.Extensions.Hosting namespace.

  • Remplacez IApplicationLifetime par IHostApplicationLifetime (espace de noms Microsoft.Extensions.Hosting).Replace IApplicationLifetime with IHostApplicationLifetime (Microsoft.Extensions.Hosting namespace).

  • Remplacez EnvironmentName par Environments (espace de noms Microsoft.Extensions.Hosting).Replace EnvironmentName with Environments (Microsoft.Extensions.Hosting namespace).

Le code suivant est un exemple de Startup.Configure dans une application ASP.NET Core 2,2 classique :The following code is an example of Startup.Configure in a typical ASP.NET Core 2.2 app:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();

    app.UseAuthentication();

    app.UseSignalR(hubs =>
    {
        hubs.MapHub<ChatHub>("/chat");
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Après la mise à jour du code Startup.Configure précédent :After updating the previous Startup.Configure code:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();

    app.UseRouting();

    app.UseCors();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chat");
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Avertissement

Pour la plupart des applications, les appels à UseAuthentication, UseAuthorization et UseCors doivent apparaître entre les appels à UseRouting et UseEndpoints pour être effectifs.For most apps, calls to UseAuthentication, UseAuthorization, and UseCors must appear between the calls to UseRouting and UseEndpoints to be effective.

Contrôles d’intégritéHealth Checks

Les contrôles d’intégrité utilisent le routage de point de terminaison avec l’hôte générique.Health Checks use endpoint routing with the Generic Host. Dans Startup.Configure, appelez MapHealthChecks sur le générateur de point de terminaison à l’aide de l’URL de point de terminaison ou du chemin d’accès relatif :In Startup.Configure, call MapHealthChecks on the endpoint builder with the endpoint URL or relative path:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

Les points de terminaison de contrôle d’intégrité peuvent :Health Checks endpoints can:

  • Spécifiez un ou plusieurs hôtes/ports autorisés.Specify one or more permitted hosts/ports.
  • Exiger une autorisation.Require authorization.
  • Exiger CORS.Require CORS.

Pour plus d'informations, consultez Contrôles d’intégrité dans ASP.NET Core.For more information, see Contrôles d’intégrité dans ASP.NET Core.

Aide sur le middleware de sécuritéSecurity middleware guidance

La prise en charge de l’autorisation et de CORS est unifiée autour de l’approche de l' intergiciel (middleware ).Support for authorization and CORS is unified around the middleware approach. Cela permet d’utiliser les mêmes intergiciels et fonctionnalités dans ces scénarios.This allows use of the same middleware and functionality across these scenarios. Un intergiciel (middleware) d’autorisation mis à jour est fourni dans cette version, et l’intergiciel (middleware) CORS est amélioré afin de pouvoir comprendre les attributs utilisés par les contrôleurs MVC.An updated authorization middleware is provided in this release, and CORS Middleware is enhanced so that it can understand the attributes used by MVC controllers.

CORSCORS

Auparavant, CORS pouvait être difficile à configurer.Previously, CORS could be difficult to configure. L’intergiciel était fourni pour une utilisation dans certains cas d’utilisation, mais les filtres MVC devaient être utilisés sans l’intergiciel dans d’autres cas d’usage.Middleware was provided for use in some use cases, but MVC filters were intended to be used without the middleware in other use cases. Avec ASP.NET Core 3,0, nous recommandons que toutes les applications qui requièrent CORS utilisent l’intergiciel (middleware) CORS en tandem avec le routage du point de terminaison.With ASP.NET Core 3.0, we recommend that all apps that require CORS use the CORS Middleware in tandem with Endpoint Routing. UseCors peut être fourni avec une stratégie par défaut et les attributs [EnableCors] et [DisableCors] peuvent être utilisés pour remplacer la stratégie par défaut si nécessaire.UseCors can be provided with a default policy, and [EnableCors] and [DisableCors] attributes can be used to override the default policy where required.

Dans l’exemple suivant :In the following example:

  • CORS est activé pour tous les points de terminaison avec la stratégie nommée default.CORS is enabled for all endpoints with the default named policy.
  • La classe MyController désactive CORS avec l’attribut [DisableCors].The MyController class disables CORS with the [DisableCors] attribute.
public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseCors("default");

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

[DisableCors]
public class MyController : ControllerBase
{
    ...
}

AutorisationAuthorization

Dans les versions antérieures de ASP.NET Core, la prise en charge de l’autorisation a été fournie via l’attribut [Authorize].In earlier versions of ASP.NET Core, authorization support was provided via the [Authorize] attribute. L’intergiciel d’autorisation n’est pas disponible.Authorization middleware wasn't available. Dans ASP.NET Core 3,0, l’intergiciel (middleware) d’autorisation est requis.In ASP.NET Core 3.0, authorization middleware is required. Nous vous recommandons de placer le ASP.NET Core middleware d’autorisation (UseAuthorization) immédiatement après UseAuthentication.We recommend placing the ASP.NET Core Authorization Middleware (UseAuthorization) immediately after UseAuthentication. L’intergiciel d’autorisation peut également être configuré avec une stratégie par défaut, qui peut être remplacée.The Authorization Middleware can also be configured with a default policy, which can be overridden.

Dans ASP.NET Core 3,0 ou version ultérieure, UseAuthorization est appelé dans Startup.Configure, et l' HomeController suivante nécessite un utilisateur connecté :In ASP.NET Core 3.0 or later, UseAuthorization is called in Startup.Configure, and the following HomeController requires a signed in user:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

public class HomeController : ControllerBase
{
    [Authorize]
    public IActionResult BuyWidgets()
    {
        ...
    }
}

Si l’application utilise un AuthorizeFilter comme filtre global dans MVC, nous vous recommandons de refactoriser le code pour fournir une stratégie dans l’appel à AddAuthorization.If the app uses an AuthorizeFilter as a global filter in MVC, we recommend refactoring the code to provide a policy in the call to AddAuthorization.

La DefaultPolicy est initialement configurée pour exiger l’authentification, de sorte qu’aucune configuration supplémentaire n’est requise.The DefaultPolicy is initially configured to require authentication, so no additional configuration is required. Dans l’exemple suivant, les points de terminaison MVC sont marqués comme étant RequireAuthorization, de sorte que toutes les requêtes doivent être autorisées en fonction de la DefaultPolicy.In the following example, MVC endpoints are marked as RequireAuthorization so that all requests must be authorized based on the DefaultPolicy. Toutefois, l' HomeController autorise l’accès sans que l’utilisateur se connecte à l’application en raison d' [AllowAnonymous]:However, the HomeController allows access without the user signing into the app due to [AllowAnonymous]:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute().RequireAuthorization();
    });
}

[AllowAnonymous]
public class HomeController : ControllerBase
{
    ...
}

Les stratégies peuvent également être personnalisées.Policies can also be customized. En s’appuyant sur l’exemple précédent, le DefaultPolicy est configuré pour exiger une authentification et une étendue spécifique :Building upon the previous example, the DefaultPolicy is configured to require authentication and a specific scope:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
          .RequireAuthenticatedUser()
          .Build();
    });
}

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute().RequireAuthorization();
    });
}

[AllowAnonymous]
public class HomeController : ControllerBase
{
    ...
}

Sinon, tous les points de terminaison peuvent être configurés pour exiger une autorisation sans [Authorize] ou RequireAuthorization en configurant un FallbackPolicy.Alternatively, all endpoints can be configured to require authorization without [Authorize] or RequireAuthorization by configuring a FallbackPolicy. La FallbackPolicy est différente de la DefaultPolicy.The FallbackPolicy is different from the DefaultPolicy. Le DefaultPolicy est déclenché par [Authorize] ou RequireAuthorization, tandis que le FallbackPolicy est déclenché quand aucune autre stratégie n’est définie.The DefaultPolicy is triggered by [Authorize] or RequireAuthorization, while the FallbackPolicy is triggered when no other policy is set. FallbackPolicy est initialement configuré pour autoriser les demandes sans autorisation.FallbackPolicy is initially configured to allow requests without authorization.

L’exemple suivant est identique à l’exemple précédent DefaultPolicy mais utilise le FallbackPolicy pour toujours exiger l’authentification sur tous les points de terminaison, sauf lorsque [AllowAnonymous] est spécifié :The following example is the same as the preceding DefaultPolicy example but uses the FallbackPolicy to always require authentication on all endpoints except when [AllowAnonymous] is specified:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddAuthorization(options =>
    {
        options.FallbackPolicy = new AuthorizationPolicyBuilder()
          .RequireAuthenticatedUser()
          .Build();
    });
}

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

[AllowAnonymous]
public class HomeController : ControllerBase
{
    ...
}

L’autorisation par intergiciel fonctionne sans que l’infrastructure ait une connaissance spécifique de l’autorisation.Authorization by middleware works without the framework having any specific knowledge of authorization. Par exemple, les contrôles d’intégrité n’ont aucune connaissance spécifique de l’autorisation, mais les contrôles d’intégrité peuvent avoir une stratégie d’autorisation configurable appliquée par l’intergiciel (middleware).For instance, health checks has no specific knowledge of authorization, but health checks can have a configurable authorization policy applied by the middleware.

En outre, chaque point de terminaison peut personnaliser ses exigences d’autorisation.Additionally, each endpoint can customize its authorization requirements. Dans l’exemple suivant, UseAuthorization traite l’autorisation avec la DefaultPolicy, mais le point de terminaison de contrôle d’intégrité /healthz nécessite un utilisateur admin :In the following example, UseAuthorization processes authorization with the DefaultPolicy, but the /healthz health check endpoint requires an admin user:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints
            .MapHealthChecks("/healthz")
            .RequireAuthorization(new AuthorizeAttribute(){ Roles = "admin", });
    });
}

La protection est implémentée pour certains scénarios.Protection is implemented for some scenarios. L’intergiciel (middleware) de points de terminaison lève une exception si une stratégie d’autorisation ou CORS est ignorée en raison d’un intergiciel (middleware) manquant.Endpoints Middleware throws an exception if an authorization or CORS policy is skipped due to missing middleware. La prise en charge de l’analyseur pour fournir des commentaires supplémentaires sur une configuration incompatible est en cours.Analyzer support to provide additional feedback about misconfiguration is in progress.

Gestionnaires d’autorisations personnalisésCustom authorization handlers

Si l’application utilise des gestionnaires d’autorisationspersonnalisés, sachez que le routage des points de terminaison passe un type de ressource différent aux gestionnaires que Mvc.If the app uses custom authorization handlers, be aware that endpoint routing passes a different resource type to handlers than MVC. Les gestionnaires qui attendent que la ressource de contexte du gestionnaire d’autorisations soit de type AuthorizationFilterContext (le type de ressource fourni par les filtres MVC) doivent être mis à jour pour gérer les ressources de type RouteEndpoint (le type de ressource donné aux gestionnaires d’autorisation par routage de point de terminaison).Handlers that expect the authorization handler context resource to be of type AuthorizationFilterContext (the resource type provided by MVC filters) will need to be updated to handle resources of type RouteEndpoint (the resource type given to authorization handlers by endpoint routing).

MVC utilise toujours AuthorizationFilterContext ressources. ainsi, si l’application utilise des filtres d’autorisation MVC avec l’autorisation de routage de point de terminaison, il peut être nécessaire de gérer les deux types de ressources.MVC still uses AuthorizationFilterContext resources, so if the app uses MVC authorization filters along with endpoint routing authorization, it may be necessary to handle both types of resources.

SignalR

Le mappage de SignalR hubs s’effectue désormais dans UseEndpoints.Mapping of SignalR hubs now takes place inside UseEndpoints.

Mappez chaque concentrateur avec MapHub.Map each hub with MapHub. Comme dans les versions précédentes, chaque concentrateur est explicitement listé.As in previous versions, each hub is explicitly listed.

Dans l’exemple suivant, la prise en charge du Hub ChatHub SignalR est ajoutée :In the following example, support for the ChatHub SignalR hub is added:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>();
    });
}

Une nouvelle option permet de contrôler les limites de taille des messages des clients.There is a new option for controlling message size limits from clients. Par exemple, dans Startup.ConfigureServices :For example, in Startup.ConfigureServices:

services.AddSignalR(hubOptions =>
{
    hubOptions.MaximumReceiveMessageSize = 32768;
});

Dans ASP.NET Core 2,2, vous pouvez définir le TransportMaxBufferSize et cela permet de contrôler la taille de message maximale.In ASP.NET Core 2.2, you could set the TransportMaxBufferSize and that would effectively control the maximum message size. Dans ASP.NET Core 3,0, cette option contrôle désormais uniquement la taille maximale avant que la contre-pression soit observée.In ASP.NET Core 3.0, that option now only controls the maximum size before backpressure is observed.

Contrôleurs MVCMVC controllers

Le mappage de contrôleurs a maintenant lieu dans UseEndpoints.Mapping of controllers now takes place inside UseEndpoints.

Ajoutez MapControllers si l’application utilise le routage d’attributs.Add MapControllers if the app uses attribute routing. Dans la mesure où le routage inclut la prise en charge de nombreuses infrastructures dans ASP.NET Core 3,0 ou version ultérieure, l’ajout de contrôleurs routés par attribut est un abonnement.Since routing includes support for many frameworks in ASP.NET Core 3.0 or later, adding attribute-routed controllers is opt-in.

Remplacez ce qui suit :Replace the following:

  • MapRoute avec MapControllerRouteMapRoute with MapControllerRoute
  • MapAreaRoute avec MapAreaControllerRouteMapAreaRoute with MapAreaControllerRoute

Étant donné que le routage inclut désormais une prise en charge de plus que MVC, la terminologie a changé pour indiquer clairement ce qu’ils font.Since routing now includes support for more than just MVC, the terminology has changed to make these methods clearly state what they do. Les itinéraires conventionnels tels que les MapControllerRoute / MapAreaControllerRoute / MapDefaultControllerRoute sont appliqués dans l’ordre dans lequel ils sont ajoutés.Conventional routes such as MapControllerRoute/MapAreaControllerRoute/MapDefaultControllerRoute are applied in the order that they're added. Placez d’abord des itinéraires plus spécifiques (tels que des itinéraires pour une zone).Place more specific routes (such as routes for an area) first.

Dans l’exemple suivant :In the following example:

  • MapControllers ajoute la prise en charge des contrôleurs routés par attribut.MapControllers adds support for attribute-routed controllers.
  • MapAreaControllerRoute ajoute une route conventionnelle pour les contrôleurs dans une zone.MapAreaControllerRoute adds a conventional route for controllers in an area.
  • MapControllerRoute ajoute une route conventionnelle pour les contrôleurs.MapControllerRoute adds a conventional route for controllers.
public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapAreaControllerRoute(
            "admin",
            "admin",
            "Admin/{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllerRoute(
            "default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Suppression du suffixe Async des noms d’action du contrôleurAsync suffix removal from controller action names

Dans ASP.NET Core 3,0, ASP.NET Core MVC supprime le suffixe Async des noms d’action du contrôleur.In ASP.NET Core 3.0, ASP.NET Core MVC removes the Async suffix from controller action names. Le routage et la génération de liens sont affectés par cette nouvelle valeur par défaut.Both routing and link generation are impacted by this new default. Exemple :For example:

public class ProductsController : Controller
{
    public async Task<IActionResult> ListAsync()
    {
        var model = await _dbContext.Products.ToListAsync();
        return View(model);
    }
}

Avant ASP.NET Core 3,0 :Prior to ASP.NET Core 3.0:

  • L’action précédente est accessible à l’itinéraire Products/ListAsync .The preceding action could be accessed at the Products/ListAsync route.

  • Génération de lien requise spécifiant le suffixe Async.Link generation required specifying the Async suffix. Exemple :For example:

    <a asp-controller="Products" asp-action="ListAsync">List</a>
    

Dans ASP.NET Core 3,0 :In ASP.NET Core 3.0:

  • L’action précédente est accessible à l’itinéraire Products/List .The preceding action can be accessed at the Products/List route.

  • La génération de liens ne nécessite pas la spécification du suffixe Async.Link generation doesn't require specifying the Async suffix. Exemple :For example:

    <a asp-controller="Products" asp-action="List">List</a>
    

Cette modification n’affecte pas les noms spécifiés à l’aide de l’attribut [ActionName] .This change doesn't affect names specified using the [ActionName] attribute. Le comportement par défaut peut être désactivé avec le code suivant dans Startup.ConfigureServices :The default behavior can be disabled with the following code in Startup.ConfigureServices:

services.AddMvc(options =>
    options.SuppressAsyncSuffixInActionNames = false);

Comme expliqué dans la documentation sur les différences par rapport aux versions antérieures du routage, il existe quelques différences dans la génération de liens (à l’aide de Url.Link et d’API similaires, par exemple).As explained in documentation on differences from earlier versions of routing, there are some differences in link generation (using Url.Link and similar APIs, for example). Elles incluent notamment les suivantes :These include:

  • Par défaut, lors de l’utilisation du routage de point de terminaison, la casse des paramètres d’itinéraire dans les URI générés n’est pas nécessairement préservée.By default, when using endpoint routing, casing of route parameters in generated URIs is not necessarily preserved. Ce comportement peut être contrôlé à l’aide de l’interface IOutboundParameterTransformer.This behavior can be controlled with the IOutboundParameterTransformer interface.
  • La génération d’un URI pour un itinéraire non valide (un contrôleur/une action ou une page qui n’existe pas) produira une chaîne vide sous le routage de point de terminaison au lieu de produire un URI non valide.Generating a URI for an invalid route (a controller/action or page that doesn't exist) will produce an empty string under endpoint routing instead of producing an invalid URI.
  • Les valeurs ambiantes (paramètres d’itinéraire du contexte actuel) ne sont pas utilisées automatiquement dans la génération de liens avec le routage de point de terminaison.Ambient values (route parameters from the current context) are not automatically used in link generation with endpoint routing. Précédemment, lors de la génération d’un lien vers une autre action (ou page), les valeurs d’itinéraire non spécifiées seraient déduites des valeurs ambiantes des itinéraires actuels .Previously, when generating a link to another action (or page), unspecified route values would be inferred from the current routes ambient values. Lorsque vous utilisez le routage de point de terminaison, tous les paramètres de routage doivent être spécifiés explicitement lors de la génération de liens.When using endpoint routing, all route parameters must be specified explicitly during link generation.

Pages RazorRazor Pages

Le mappage de Razor Pages a maintenant lieu à l’intérieur de UseEndpoints.Mapping Razor Pages now takes place inside UseEndpoints.

Ajoutez MapRazorPages si l’application utilise Razor Pages.Add MapRazorPages if the app uses Razor Pages. Dans la mesure où le routage des points de terminaison inclut la prise en charge de nombreuses infrastructures, l’ajout de Razor Pages est désormais un abonnement.Since Endpoint Routing includes support for many frameworks, adding Razor Pages is now opt-in.

Dans la méthode Startup.Configure suivante, MapRazorPages ajoute la prise en charge de Razor Pages :In the following Startup.Configure method, MapRazorPages adds support for Razor Pages:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Utiliser MVC sans routage de point de terminaisonUse MVC without Endpoint Routing

L’utilisation de MVC via UseMvc ou UseMvcWithDefaultRoute dans ASP.NET Core 3,0 requiert un abonnement explicite à l’intérieur de Startup.ConfigureServices.Using MVC via UseMvc or UseMvcWithDefaultRoute in ASP.NET Core 3.0 requires an explicit opt-in inside Startup.ConfigureServices. Cela est nécessaire, car MVC doit savoir s’il peut reposer sur l’autorisation et l’intergiciel CORS pendant l’initialisation.This is required because MVC must know whether it can rely on the authorization and CORS Middleware during initialization. Un analyseur est fourni pour avertir si l’application tente d’utiliser une configuration non prise en charge.An analyzer is provided that warns if the app attempts to use an unsupported configuration.

Si l’application nécessite la prise en charge de l’ancien IRouter, désactivez EnableEndpointRouting à l’aide de l’une des approches suivantes dans Startup.ConfigureServices :If the app requires legacy IRouter support, disable EnableEndpointRouting using any of the following approaches in Startup.ConfigureServices:

services.AddMvc(options => options.EnableEndpointRouting = false);
services.AddControllers(options => options.EnableEndpointRouting = false);
services.AddControllersWithViews(options => options.EnableEndpointRouting = false);
services.AddRazorPages().AddMvcOptions(options => options.EnableEndpointRouting = false);

Contrôles d’intégritéHealth checks

Les contrôles d’intégrité peuvent être utilisés en tant que routeur avec routage des points de terminaison.Health checks can be used as a router-ware with Endpoint Routing.

Ajoutez MapHealthChecks pour utiliser les contrôles d’intégrité avec le routage des points de terminaison.Add MapHealthChecks to use health checks with Endpoint Routing. La méthode MapHealthChecks accepte des arguments similaires à UseHealthChecks.The MapHealthChecks method accepts arguments similar to UseHealthChecks. L’avantage de l’utilisation de MapHealthChecks sur UseHealthChecks est la possibilité d’appliquer une autorisation et de bénéficier d’un contrôle plus précis de la stratégie de correspondance.The advantage of using MapHealthChecks over UseHealthChecks is the ability to apply authorization and to have greater fine-grained control over the matching policy.

Dans l’exemple suivant, MapHealthChecks est appelé pour un point de terminaison de contrôle d’intégrité à /healthz :In the following example, MapHealthChecks is called for a health check endpoint at /healthz:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHealthChecks("/healthz", new HealthCheckOptions() { });
    });
}

HostBuilder remplace WebHostBuilderHostBuilder replaces WebHostBuilder

Les modèles ASP.NET Core 3,0 utilisent l' hôte générique.The ASP.NET Core 3.0 templates use Generic Host. Les versions précédentes utilisaient l' hôte Web.Previous versions used Web Host. Le code suivant illustre le modèle ASP.NET Core 3,0 généré Program Class :The following code shows the ASP.NET Core 3.0 template generated Program class:

// requires using Microsoft.AspNetCore.Hosting;
// requires using Microsoft.Extensions.Hosting;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Le code suivant illustre la classe Program générée par le modèle ASP.NET Core 2,2 :The following code shows the ASP.NET Core 2.2 template-generated Program class:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

IWebHostBuilder reste dans 3,0 et est le type de la webBuilder visible dans l’exemple de code précédent.IWebHostBuilder remains in 3.0 and is the type of the webBuilder seen in the preceding code sample. WebHostBuilder sera dépréciée dans une version ultérieure et remplacée par HostBuilder.WebHostBuilder will be deprecated in a future release and replaced by HostBuilder.

La modification la plus significative entre WebHostBuilder et HostBuilder est dans l' injection de dépendances (di).The most significant change from WebHostBuilder to HostBuilder is in dependency injection (DI). Lorsque vous utilisez HostBuilder, vous pouvez uniquement injecter les éléments suivants dans le constructeur de Startup :When using HostBuilder, you can only inject the following into Startup's constructor:

Contraintes d’injection de HostBuilder :The HostBuilder DI constraints:

  • Autorisez la génération du conteneur DI une seule fois.Enable the DI container to be built only one time.
  • Évite les problèmes de durée de vie des objets résultants, tels que la résolution de plusieurs instances de singletons.Avoids the resulting object lifetime issues like resolving multiple instances of singletons.

AddAuthorization déplacé vers un autre assemblyAddAuthorization moved to a different assembly

Les ASP.NET Core 2,2 et les méthodes AddAuthorization inférieures dans Microsoft. AspNetCore. Authorization. dll:The ASP.NET Core 2.2 and lower AddAuthorization methods in Microsoft.AspNetCore.Authorization.dll:

  • Ont été renommés AddAuthorizationCore.Have been renamed AddAuthorizationCore.
  • Ont été déplacés vers Microsoft. AspNetCore. Authorization. Policy. dll.Have been moved to Microsoft.AspNetCore.Authorization.Policy.dll.

Les applications qui utilisent à la fois Microsoft. AspNetCore. Authorization. dll et Microsoft. AspNetCore. Authorization. Policy. dll ne sont pas affectées.Apps that are using both Microsoft.AspNetCore.Authorization.dll and Microsoft.AspNetCore.Authorization.Policy.dll aren't impacted.

Les applications qui n’utilisent pas Microsoft. AspNetCore. Authorization. Policy. dll doivent effectuer l’une des opérations suivantes :Apps that are not using Microsoft.AspNetCore.Authorization.Policy.dll should do one of the following:

  • Ajoutez une référence à Microsoft. AspNetCore. Authorization. Policy. dll.Add a reference to Microsoft.AspNetCore.Authorization.Policy.dll. Cette approche fonctionne pour la plupart des applications et est tout ce qui est nécessaire.This approach works for most apps and is all that is required.
  • Passer à l’utilisation de AddAuthorizationCoreSwitch to using AddAuthorizationCore

Pour plus d’informations, consultez modification avec rupture dans AddAuthorization(o =>) surcharges dans un autre assembly #386.For more information, see Breaking change in AddAuthorization(o =>) overload lives in a different assembly #386.

Interface utilisateur d’identitéIdentity UI

Mises à jour de l’interface utilisateur des identités pour ASP.NET Core 3,0 :Identity UI updates for ASP.NET Core 3.0:

  • Ajoutez une référence de package à Microsoft. AspNetCore. Identity. UI.Add a package reference to Microsoft.AspNetCore.Identity.UI.
  • Les applications qui n’utilisent pas Razor Pages doivent appeler MapRazorPages.Apps that don't use Razor Pages must call MapRazorPages. Consultez Razor pages dans ce document.See Razor Pages in this document.
  • Bootstrap 4 est l’infrastructure d’interface utilisateur par défaut.Bootstrap 4 is the default UI framework. Définissez une propriété de projet IdentityUIFrameworkVersion pour modifier la valeur par défaut.Set an IdentityUIFrameworkVersion project property to change the default. Pour plus d’informations, consultez cette annonce GitHub.For more information, see this GitHub announcement.

SignalR

Le client JavaScript SignalR est passé de @aspnet/signalr à @microsoft/signalr.The SignalR JavaScript client has changed from @aspnet/signalr to @microsoft/signalr. Pour réagir à cette modification, modifiez les références dans les fichiers Package. JSON , les instructions require et les instructions ECMAScript import.To react to this change, change the references in package.json files, require statements, and ECMAScript import statements.

System. Text. JSON est le protocole par défautSystem.Text.Json is the default protocol

System.Text.Json est maintenant le protocole de concentrateur par défaut utilisé par le client et le serveur.System.Text.Json is now the default Hub protocol used by both the client and server.

Dans Startup.ConfigureServices, appelez AddJsonProtocol pour définir les options du sérialiseur.In Startup.ConfigureServices, call AddJsonProtocol to set serializer options.

ServeursServer:

services.AddSignalR(...)
        .AddJsonProtocol(options =>
        {
            options.PayloadSerializerOptions.WriteIndented = false;
        })

Client :Client:

new HubConnectionBuilder()
    .WithUrl("/chatHub")
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerOptions.WriteIndented = false;
    })
    .Build();

Basculer vers Newtonsoft. JSONSwitch to Newtonsoft.Json

Si vous utilisez des fonctionnalités de Newtonsoft.Json qui ne sont pas prises en charge dans System.Text.Json, vous pouvez revenir à Newtonsoft.Json :If you're using features of Newtonsoft.Json that aren't supported in System.Text.Json, you can switch back to Newtonsoft.Json:

  1. Installez Microsoft. AspNetCore.SignalR. Package NuGet Protocols. NewtonsoftJson .Install the Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson NuGet package.

  2. Sur le client, chaînez un appel de méthode AddNewtonsoftJsonProtocol à l’instance HubConnectionBuilder :On the client, chain an AddNewtonsoftJsonProtocol method call to the HubConnectionBuilder instance:

    new HubConnectionBuilder()
        .WithUrl("/chatHub")
        .AddNewtonsoftJsonProtocol(...)
        .Build();
    
  3. Sur le serveur, chaînez un appel de méthode AddNewtonsoftJsonProtocol à l’appel de méthode AddSignalR dans Startup.ConfigureServices :On the server, chain an AddNewtonsoftJsonProtocol method call to the AddSignalR method call in Startup.ConfigureServices:

    services.AddSignalR()
        .AddNewtonsoftJsonProtocol(...);
    

Accepter la compilation au moment de l’exécutionOpt in to runtime compilation

Avant ASP.NET Core 3,0, la compilation du runtime des vues était une fonctionnalité implicite de l’infrastructure.Prior to ASP.NET Core 3.0, runtime compilation of views was an implicit feature of the framework. La compilation Runtime complète la compilation des vues au moment de la génération.Runtime compilation supplements build-time compilation of views. Il permet à l’infrastructure de compiler des vues et des pages Razor (fichiers . cshtml ) quand les fichiers sont modifiés, sans avoir à régénérer l’application entière.It allows the framework to compile Razor views and pages (.cshtml files) when the files are modified, without having to rebuild the entire app. Cette fonctionnalité prend en charge le scénario d’apport d’une modification rapide dans l’IDE et d’actualisation du navigateur pour afficher les modifications.This feature supports the scenario of making a quick edit in the IDE and refreshing the browser to view the changes.

Dans ASP.NET Core 3,0, la compilation du runtime est un scénario d’abonnement.In ASP.NET Core 3.0, runtime compilation is an opt-in scenario. La compilation au moment de la génération est le seul mécanisme pour la compilation de la vue qui est activée par défaut.Build-time compilation is the only mechanism for view compilation that's enabled by default. Le runtime s’appuie sur Visual Studio ou dotnet-Watch dans Visual Studio code pour régénérer le projet lorsqu’il détecte des modifications apportées aux fichiers . cshtml .The runtime relies on Visual Studio or dotnet-watch in Visual Studio Code to rebuild the project when it detects changes to .cshtml files. Dans Visual Studio, les modifications apportées aux fichiers . cs, . cshtmlou . Razor dans le projet en cours d’exécution (CTRL + F5), mais pas débogués (F5), déclenchent la recompilation du projet.In Visual Studio, changes to .cs, .cshtml, or .razor files in the project being run (Ctrl+F5), but not debugged (F5), trigger recompilation of the project.

Pour activer la compilation au moment de l’exécution dans votre projet ASP.NET Core 3,0 :To enable runtime compilation in your ASP.NET Core 3.0 project:

  1. Installer le package NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Install the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package.

  2. Mettez à jour Startup.ConfigureServices pour appeler AddRazorRuntimeCompilation :Update Startup.ConfigureServices to call AddRazorRuntimeCompilation:

    Pour ASP.NET Core MVC, utilisez le code suivant :For ASP.NET Core MVC, use the following code:

    services.AddControllersWithViews()
        .AddRazorRuntimeCompilation(...);
    

    Pour ASP.NET Core Razor Pages, utilisez le code suivant :For ASP.NET Core Razor Pages, use the following code:

    services.AddRazorPages()
        .AddRazorRuntimeCompilation(...);
    

L’exemple à https://github.com/aspnet/samples/tree/master/samples/aspnetcore/mvc/runtimecompilation montre un exemple d’activation conditionnelle de la compilation au moment de l’exécution dans les environnements de développement.The sample at https://github.com/aspnet/samples/tree/master/samples/aspnetcore/mvc/runtimecompilation shows an example of enabling runtime compilation conditionally in Development environments.

Pour plus d’informations sur la compilation de fichiers Razor, consultez Compilation de fichiers Razor dans ASP.NET Core.For more information on Razor file compilation, see Compilation de fichiers Razor dans ASP.NET Core.

Migrer des bibliothèques via le multi-ciblageMigrate libraries via multi-targeting

Les bibliothèques doivent souvent prendre en charge plusieurs versions de ASP.NET Core.Libraries often need to support multiple versions of ASP.NET Core. La plupart des bibliothèques qui ont été compilées avec des versions antérieures de ASP.NET Core doivent continuer à fonctionner sans problème.Most libraries that were compiled against previous versions of ASP.NET Core should continue working without issues. Les conditions suivantes nécessitent la compilation croisée de l’application :The following conditions require the app to be cross-compiled:

  • La bibliothèque s’appuie sur une fonctionnalité qui a une modification avec rupturebinaire.The library relies on a feature that has a binary breaking change.
  • La bibliothèque veut tirer parti des nouvelles fonctionnalités de ASP.NET Core 3,0.The library wants to take advantage of new features in ASP.NET Core 3.0.

Exemple :For example:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.AspNetCore" Version="2.1.0" />
  </ItemGroup>
</Project>

Utilisez #ifdefs pour activer ASP.NET Core API spécifiques à 3,0 :Use #ifdefs to enable ASP.NET Core 3.0-specific APIs:

var webRootFileProvider =
#if NETCOREAPP3_0
    GetRequiredService<IWebHostEnvironment>().WebRootFileProvider;
#elif NETSTANDARD2_0
    GetRequiredService<IHostingEnvironment>().WebRootFileProvider;
#else
#error unknown target framework
#endif

PublierPublish

Supprimez les dossiers bin et obj dans le répertoire du projet.Delete the bin and obj folders in the project directory.

TestServerTestServer

Pour les applications qui utilisent TestServer directement avec l' hôte générique, créez le TestServer sur un IWebHostBuilder dans ConfigureWebHost :For apps that use TestServer directly with the Generic Host, create the TestServer on an IWebHostBuilder in ConfigureWebHost:

[Fact]
public async Task GenericCreateAndStartHost_GetTestServer()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .Configure(app => { });
        })
    .StartAsync();

    var response = await host.GetTestServer().CreateClient().GetAsync("/");

    Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}

Interruption des modifications d’APIBreaking API changes

Examiner les modifications avec rupture :Review breaking changes:

.NET Core 3,0 sur Azure App Service.NET Core 3.0 on Azure App Service

Pour connaître la progression du déploiement de .NET Core vers Azure App Service, consultez le site Web officiel .net Core sur app service .For progress on the rollout of .NET Core to Azure App Service, see the official .NET Core on App Service website. Tant que .NET Core 3,0 n’est pas disponible sur Azure App Service, suivez les instructions de la procédure de déploiement de la version préliminaire de ASP.net core en Azure App service.Until .NET Core 3.0 is available on Azure App Service, follow the instructions at Deploy ASP.NET Core preview release to Azure App Service. AddAuthorization déplacé vers un autre assemblyAddAuthorization moved to a different assembly