Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Si vous migrez vers la version 3.0 de .NET Core, ASP.NET Core ou EF Core, les changements cassants répertoriés dans cet article peuvent affecter votre application.
ASP.NET Core
- Les API Antiforgery, CORS, Diagnostics, MVC et Routage obsolètes ont été supprimées
- Les API Pubternal ont été supprimées
- Authentification : dépréciation de Google+
- Authentication : propriété HttpContext.Authentication supprimée
- Authentification : types Newtonsoft.Json remplacés
- Authentification : signature OAuthHandler ExchangeCodeAsync modifiée
- Autorisation : surcharge AddAuthorization déplacée vers un autre assembly
- Autorisation : IAllowAnonymous supprimé de AuthorizationFilterContext.Filters
- Autorisation : les implémentations IAuthorizationPolicyProvider nécessitent une nouvelle méthode
- Mise en cache : propriété CompactOnMemoryPressure supprimée
- Mise en cache : Microsoft.Extensions.Caching.SqlServer utilise le nouveau package SqlClient
- Mise en cache : les types « pubternal » responseCaching sont passés à internes
- Protection des données : DataProtection.Blobs utilise de nouvelles API de stockage Azure
- Hébergement : AspNetCoreModule V1 supprimé de l’offre groupée d’hébergement Windows
- Hébergement : l’hôte générique restreint l’injection de constructeur de démarrage
- Hébergement : redirection HTTPS activée pour les applications hors processus IIS
- Hébergement : types IHostingEnvironment et IApplicationLifetime remplacés
- Hébergement : ObjectPoolProvider supprimé des dépendances WebHostBuilder
- HTTP : extensibilité DefaultHttpContext supprimée
- HTTP : les champs HeaderNames sont passés à des champs statiques en lecture seule
- HTTP : changements de l’infrastructure du corps de la réponse
- HTTP : certaines valeurs par défaut SameSite du cookie ont été modifiées
- HTTP : E/S synchrones désactivées par défaut
- Identité : surcharge de la méthode AddDefaultUI supprimée
- Identité : changement de version du démarrage de l’interface utilisateur
- Identité : SignInAsync lève l’exception pour l’identité non authentifiée
- Identité : le constructeur SignInManager accepte le nouveau paramètre
- Identité : l’interface utilisateur utilise la fonctionnalité de ressources web statiques
- Kestrel : adaptateurs de connexion supprimés
- Kestrel : assembly HTTPS vide supprimé
- Kestrel : les en-têtes de codes de fin des requêtes ont été déplacés vers la nouvelle collection
- Kestrel : changements de la couche d’abstraction de transport
- Localisation : API marquées comme obsolètes
- Journalisation : la classe DebugLogger est devenue interne
- MVC : suffixe asynchrone de l’action du contrôleur supprimé
- MVC : JsonResult déplacé vers Microsoft.AspNetCore.Mvc.Core
- MVC : outil de précompilation déconseillé
- MVC : types passés à internes
- MVC : le shim de compatibilité de l’API web a été supprimé
- Razor : API RazorTemplateEngine supprimée
- Razor : compilation du runtime déplacée vers un package
- État de session : API obsolètes supprimées
- Infrastructure partagée : assembly supprimé de Microsoft.AspNetCore.App
- Infrastructure partagée : Microsoft.AspNetCore.All supprimé
- SignalR : HandshakeProtocol.SuccessHandshakeData remplacé
- SignalR : méthodes HubConnection supprimées
- SignalR : constructeurs HubConnectionContext modifiés
- SignalR : changement de nom du package client JavaScript
- SignalR : API obsolètes
- SPA : SpaServices et NodeServices marqués comme obsolètes
- SPA : changement par défaut de secours de l’enregistreur d’événements de la console SpaServices et NodeServices
- Version cible de .Net Framework : .NET Framework non pris en charge
Les API Antiforgery, CORS, Diagnostics, MVC et Routage obsolètes ont été supprimées
Les membres et les commutateurs de compatibilité obsolètes dans ASP.NET Core 2.2 ont été supprimés.
Version introduite
3.0
Raison de la modification
Amélioration de la surface de l’API au fil du temps.
Action recommandée
Tout en ciblant .NET Core 2.2, suivez les instructions des messages de build obsolètes pour adopter de nouvelles API à la place.
Catégorie
ASP.NET Core
API affectées
Les types et membres suivants ont été marqués comme obsolètes pour ASP.NET Core 2.1 et 2.2 :
Types
Microsoft.AspNetCore.Diagnostics.Views.WelcomePageMicrosoft.AspNetCore.DiagnosticsViewPage.Views.AttributeValueMicrosoft.AspNetCore.DiagnosticsViewPage.Views.BaseViewMicrosoft.AspNetCore.DiagnosticsViewPage.Views.HelperResultMicrosoft.AspNetCore.Mvc.Formatters.Xml.ProblemDetails21WrapperMicrosoft.AspNetCore.Mvc.Formatters.Xml.ValidationProblemDetails21WrapperMicrosoft.AspNetCore.Mvc.Razor.Compilation.ViewsFeatureProviderMicrosoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageArgumentBinderMicrosoft.AspNetCore.Routing.IRouteValuesAddressMetadataMicrosoft.AspNetCore.Routing.RouteValuesAddressMetadata
Constructeurs
Microsoft.AspNetCore.Cors.Infrastructure.CorsService(IOptions{CorsOptions})Microsoft.AspNetCore.Routing.Tree.TreeRouteBuilder(ILoggerFactory,UrlEncoder,ObjectPool{UriBuildingContext},IInlineConstraintResolver)Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterCanWriteContextMicrosoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider(IOptions{MvcOptions},IInlineConstraintResolver,IModelMetadataProvider)Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider(IOptions{MvcOptions},IInlineConstraintResolver,IModelMetadataProvider,IActionResultTypeMapper)Microsoft.AspNetCore.Mvc.Formatters.FormatFilter(IOptions{MvcOptions})Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ArrayModelBinder`1(IModelBinder)Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ByteArrayModelBinder- Microsoft.AspNetCore.Mvc.ModelBinding.Binders.CollectionModelBinder`1(IModelBinder)
- Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder(IDictionary`2)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DictionaryModelBinder`2(IModelBinder,IModelBinder)Microsoft.AspNetCore.Mvc.ModelBinding.Binders.DoubleModelBinder(System.Globalization.NumberStyles)Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FloatModelBinder(System.Globalization.NumberStyles)Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinderMicrosoft.AspNetCore.Mvc.ModelBinding.Binders.FormFileModelBinderMicrosoft.AspNetCore.Mvc.ModelBinding.Binders.HeaderModelBinderMicrosoft.AspNetCore.Mvc.ModelBinding.Binders.KeyValuePairModelBinder`2(IModelBinder,IModelBinder)Microsoft.AspNetCore.Mvc.ModelBinding.Binders.SimpleTypeModelBinder(System.Type)Microsoft.AspNetCore.Mvc.ModelBinding.ModelAttributes(IEnumerable{System.Object})Microsoft.AspNetCore.Mvc.ModelBinding.ModelAttributes(IEnumerable{System.Object},IEnumerable{System.Object})Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory(IModelMetadataProvider,IOptions{MvcOptions})Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder(IModelMetadataProvider,IModelBinderFactory,IObjectModelValidator)- Microsoft.AspNetCore.Mvc.Routing.KnownRouteValueConstraint()
Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatterMicrosoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter(System.Boolean)Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerInputFormatter(MvcOptions)Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatterMicrosoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter(System.Boolean)Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter(MvcOptions)- Microsoft.AspNetCore.Mvc.TagHelpers.ImageTagHelper(IHostingEnvironment,IMemoryCache,HtmlEncoder,IUrlHelperFactory)
Microsoft.AspNetCore.Mvc.TagHelpers.LinkTagHelper(IHostingEnvironment,IMemoryCache,HtmlEncoder,JavaScriptEncoder,IUrlHelperFactory)Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper(IHostingEnvironment,IMemoryCache,HtmlEncoder,JavaScriptEncoder,IUrlHelperFactory)Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.RazorPageAdapter(RazorPageBase)
Propriétés
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieDomainMicrosoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieNameMicrosoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookiePathMicrosoft.AspNetCore.Antiforgery.AntiforgeryOptions.RequireSslMicrosoft.AspNetCore.Mvc.ApiBehaviorOptions.AllowInferringBindingSourceForCollectionTypesAsFromQueryMicrosoft.AspNetCore.Mvc.ApiBehaviorOptions.SuppressUseValidationProblemDetailsForInvalidModelStateResponsesMicrosoft.AspNetCore.Mvc.CookieTempDataProviderOptions.CookieNameMicrosoft.AspNetCore.Mvc.CookieTempDataProviderOptions.DomainMicrosoft.AspNetCore.Mvc.CookieTempDataProviderOptions.PathMicrosoft.AspNetCore.Mvc.DataAnnotations.MvcDataAnnotationsLocalizationOptions.AllowDataAnnotationsLocalizationForEnumDisplayAttributesMicrosoft.AspNetCore.Mvc.Formatters.Xml.MvcXmlOptions.AllowRfc7807CompliantProblemDetailsFormatMicrosoft.AspNetCore.Mvc.MvcOptions.AllowBindingHeaderValuesToNonStringModelTypesMicrosoft.AspNetCore.Mvc.MvcOptions.AllowCombiningAuthorizeFiltersMicrosoft.AspNetCore.Mvc.MvcOptions.AllowShortCircuitingValidationWhenNoValidatorsArePresentMicrosoft.AspNetCore.Mvc.MvcOptions.AllowValidatingTopLevelNodesMicrosoft.AspNetCore.Mvc.MvcOptions.InputFormatterExceptionPolicyMicrosoft.AspNetCore.Mvc.MvcOptions.SuppressBindingUndefinedValueToEnumTypeMicrosoft.AspNetCore.Mvc.MvcViewOptions.AllowRenderingMaxLengthAttributeMicrosoft.AspNetCore.Mvc.MvcViewOptions.SuppressTempDataAttributePrefixMicrosoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.AllowAreasMicrosoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.AllowDefaultHandlingForOptionsRequestsMicrosoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.AllowMappingHeadRequestsToGetHandler
Méthodes
Microsoft.AspNetCore.Mvc.LocalRedirectResult.ExecuteResult(ActionContext)Microsoft.AspNetCore.Mvc.RedirectResult.ExecuteResult(ActionContext)Microsoft.AspNetCore.Mvc.RedirectToActionResult.ExecuteResult(ActionContext)Microsoft.AspNetCore.Mvc.RedirectToPageResult.ExecuteResult(ActionContext)Microsoft.AspNetCore.Mvc.RedirectToRouteResult.ExecuteResult(ActionContext)Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext,IValueProvider,ParameterDescriptor)- Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext,IValueProvider,ParameterDescriptor,Object)
Les API « Pubternal » ont été supprimées
Pour mieux gérer la surface d’API publique de ASP.NET Core, la plupart des types dans *.Internal les espaces de noms (appelés API "pubternal") sont devenus vraiment internes. Les membres de ces espaces de noms n’ont jamais été conçus pour être pris en charge en tant qu’API accessibles au public. Les API peuvent s’interrompre dans les versions mineures, ce qui est souvent le cas. Le code qui dépend de ces API s’interrompt lors de la mise à jour vers ASP.NET Core 3.0.
Pour plus d’informations, consultez dotnet/aspnetcore#4932 et dotnet/aspnetcore#11312.
Version introduite
3.0
Ancien comportement
Les API affectées sont marquées avec le modificateur d’accès public et existent dans les espaces de noms *.Internal.
Nouveau comportement
Les API affectées sont marquées avec le modificateur d’accès interne et ne peuvent plus être utilisées par le code en dehors de cet assembly.
Raison de la modification
L’aide pour ces API "pubternal" était la suivante :
- Peut changer sans préavis.
- N’ont pas été soumis aux stratégies .NET pour empêcher les changements cassants.
Le fait de quitter les API public (même dans les espaces de noms *.Internal) était déroutant pour les clients.
Action recommandée
Arrêtez d’utiliser ces API "pubternal". Si vous avez des questions sur d’autres API, ouvrez un problème dans le référentiel dotnet/aspnetcore.
Par exemple, considérez le code de mise en mémoire tampon des requêtes HTTP suivant dans un projet ASP.NET Core 2.2. La méthode d’extension EnableRewind existe dans l’espace de noms Microsoft.AspNetCore.Http.Internal.
HttpContext.Request.EnableRewind();
Dans un projet ASP.NET Core 3.0, remplacez l’appel EnableRewind par un appel à la méthode d’extension EnableBuffering. La fonctionnalité de mise en mémoire tampon des requêtes fonctionne comme dans le passé. EnableBuffering appelle désormais l’API internal.
HttpContext.Request.EnableBuffering();
Catégorie
ASP.NET Core
API affectées
Toutes les API des espaces de noms Microsoft.AspNetCore.* et Microsoft.Extensions.* qui ont un segment Internal dans le nom de l’espace de noms. Par exemple :
Microsoft.AspNetCore.Authentication.InternalMicrosoft.AspNetCore.Builder.InternalMicrosoft.AspNetCore.DataProtection.Cng.InternalMicrosoft.AspNetCore.DataProtection.InternalMicrosoft.AspNetCore.Hosting.InternalMicrosoft.AspNetCore.Http.InternalMicrosoft.AspNetCore.Mvc.Core.InfrastructureMicrosoft.AspNetCore.Mvc.Core.InternalMicrosoft.AspNetCore.Mvc.Cors.InternalMicrosoft.AspNetCore.Mvc.DataAnnotations.InternalMicrosoft.AspNetCore.Mvc.Formatters.InternalMicrosoft.AspNetCore.Mvc.Formatters.Json.InternalMicrosoft.AspNetCore.Mvc.Formatters.Xml.InternalMicrosoft.AspNetCore.Mvc.InternalMicrosoft.AspNetCore.Mvc.ModelBinding.InternalMicrosoft.AspNetCore.Mvc.Razor.InternalMicrosoft.AspNetCore.Mvc.RazorPages.InternalMicrosoft.AspNetCore.Mvc.TagHelpers.InternalMicrosoft.AspNetCore.Mvc.ViewFeatures.InternalMicrosoft.AspNetCore.Rewrite.InternalMicrosoft.AspNetCore.Routing.InternalMicrosoft.AspNetCore.Server.Kestrel.Core.Adapter.InternalMicrosoft.AspNetCore.Server.Kestrel.Core.Internal.HttpMicrosoft.AspNetCore.Server.Kestrel.Core.Internal.InfrastructureMicrosoft.AspNetCore.Server.Kestrel.Https.Internal
Authentification : Google+ déconseillé et remplacé
Google a commencé à supprimer les connexions Google+ pour les applications dès le 28 janvier 2019.
Description de la modification
ASP.NET 4.x et ASP.NET Core ont utilisé les API de connexion Google+ pour authentifier les utilisateurs de compte Google dans les applications web. Les packages NuGet concernés sont Microsoft.AspNetCore.Authentication.Google pour ASP.NET Core et Microsoft.Owin.Security.Google pour Microsoft.Owin avec ASP.NET Web Forms et MVC.
Les API de remplacement de Google utilisent une source de données et un format différents. Les atténuations et les solutions fournies ci-dessous expliquent les changements structurels. Les applications doivent vérifier que les données elles-mêmes répondent toujours à leurs besoins. Par exemple, les noms, les adresses e-mail, les liens de profil et les photos de profil peuvent fournir des valeurs subtilement différentes de celles d’avant.
Version introduite
Toutes les versions. Ce changement est externe à ASP.NET Core.
Action recommandée
Owin avec ASP.NET Web Forms et MVC
Pour Microsoft.Owin la version 3.1.0 et ultérieure, une atténuation temporaire est décrite dans les impacts de l’arrêt Google+. Les applications doivent terminer le test d’atténuation pour vérifier les changements apportés au format de données. Il est prévu de mettre en production la version Microsoft.Owin 4.0.1 avec un correctif. Les applications utilisant une version antérieure doivent être mises à jour vers la version 4.0.1.
ASP.NET Core 1.x
L’atténuation dans Owin avec ASP.NET Web Forms et MVC peut être adaptée à ASP.NET Core 1.x. Les patches de packages NuGet ne sont pas prévus, car la version 1.x a atteint l’état de fin de vie.
ASP.NET Core 2.x
Pour Microsoft.AspNetCore.Authentication.Google version 2.x, remplacez votre appel existant à AddGoogle dans Startup.ConfigureServices par le code suivant :
.AddGoogle(o =>
{
o.ClientId = Configuration["Authentication:Google:ClientId"];
o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
o.UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo";
o.ClaimActions.Clear();
o.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
o.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
o.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
o.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
o.ClaimActions.MapJsonKey("urn:google:profile", "link");
o.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
});
Les patches 2.1 et 2.2 de février ont incorporé la reconfiguration précédente comme nouvelle valeur par défaut. Aucun patch n’est prévu pour ASP.NET Core 2.0 depuis sa fin de vie.
ASP.NET Core 3.0
L’atténuation donnée pour ASP.NET Core 2.x peut également être utilisée pour ASP.NET Core 3.0. Dans les prochaines préversions 3.0, le package Microsoft.AspNetCore.Authentication.Google peut être supprimé. À la place, les utilisateurs sont dirigés vers Microsoft.AspNetCore.Authentication.OpenIdConnect. Le code suivant montre comment remplacer AddGoogle par AddOpenIdConnect dans Startup.ConfigureServices. Ce remplacement peut être utilisé avec ASP.NET Core 2.0 et versions ultérieures et peut être adapté pour ASP.NET Core 1.x si nécessaire.
.AddOpenIdConnect("Google", o =>
{
o.ClientId = Configuration["Authentication:Google:ClientId"];
o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
o.Authority = "https://accounts.google.com";
o.ResponseType = OpenIdConnectResponseType.Code;
o.CallbackPath = "/signin-google"; // Or register the default "/signin-oidc"
o.Scope.Add("email");
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Authentication.Google
Authentication : propriété HttpContext.Authentication supprimée
La propriété Authentication déconseillée sur HttpContext a été supprimée.
Description de la modification
Dans le cadre de dotnet/aspnetcore#6504, la propriété Authentication déconseillée sur HttpContext a été supprimée. La propriété Authentication est déconseillée depuis 2.0. Un guide de migration a été publié pour migrer le code à l’aide de cette propriété déconseillée vers les nouvelles API de remplacement. Les classes/API inutilisées restantes liées à l’ancienne pile d’authentification ASP.NET Core 1.x ont été supprimées dans la validation dotnet/aspnetcore@d7a7c65.
Pour plus d’informations, consultez dotnet/aspnetcore#6533.
Version introduite
3.0
Raison de la modification
Les API ASP.NET Core 1.0 ont été remplacées par des méthodes d’extension dans Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.
Action recommandée
Consultez le guide de migration.
Catégorie
ASP.NET Core
API affectées
- Microsoft.AspNetCore.Http.Authentication.AuthenticateInfo
- Microsoft.AspNetCore.Http.Authentication.AuthenticationManager
- Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties
- Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext
- Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior
- Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext
- Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext
- Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler
- Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature.Handler
- Microsoft.AspNetCore.Http.Features.Authentication.SignInContext
- Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext
- Microsoft.AspNetCore.Http.HttpContext.Authentication
Authentification : types Newtonsoft.Json remplacés
Dans ASP.NET Core 3.0, les types Newtonsoft.Json utilisés dans les API d’authentification ont été remplacés par des types System.Text.Json. Sauf dans les cas suivants, l’utilisation de base des packages d’authentification n’est pas affectée :
- Classes dérivées des fournisseurs OAuth, telles que celles d’aspnet-contrib.
- Implémentations avancées de manipulation des revendications.
Pour plus d’informations, consultez dotnet/aspnetcore#7105. Pour plus d’informations, consultez dotnet/aspnetcore#7289.
Version introduite
3.0
Action recommandée
Pour les implémentations OAuth dérivées, le changement le plus courant consiste à remplacer JObject.Parse par JsonDocument.Parse dans la substitution CreateTicketAsync, comme indiqué dans dotnet/aspnetcore#7105. JsonDocument implémente IDisposable.
La liste suivante présente les changements connus :
- ClaimAction.Run(JObject, ClaimsIdentity, String) devient
ClaimAction.Run(JsonElement userData, ClaimsIdentity identity, string issuer). Toutes les implémentations dérivées deClaimActionsont affectées de la même façon. - ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, Func<JObject,String>) devient
MapCustomJson(this ClaimActionCollection collection, string claimType, Func<JsonElement, string> resolver) - ClaimActionCollectionMapExtensions.MapCustomJson(ClaimActionCollection, String, String, Func<JObject,String>) devient
MapCustomJson(this ClaimActionCollection collection, string claimType, string valueType, Func<JsonElement, string> resolver) - OAuthCreatingTicketContext a eu un ancien constructeur supprimé et l’autre a remplacé
JObjectparJsonElement. La propriétéUseret la méthodeRunClaimActionsont été mises à jour pour correspondre. - Success(JObject) accepte maintenant un paramètre de type
JsonDocumentau lieu deJObject. La propriétéResponsea été mise à jour pour correspondre.OAuthTokenResponseest maintenant jetable et sera éliminé parOAuthHandler. Les implémentations OAuth dérivées remplaçantExchangeCodeAsyncn’ont pas besoin de supprimer leJsonDocumentouOAuthTokenResponse. - UserInformationReceivedContext.User est passé de
JObjectàJsonDocument. - TwitterCreatingTicketContext.User est passé de
JObjectàJsonElement. - Le dernier paramètre de TwitterHandler.CreateTicketAsync(ClaimsIdentity,AuthenticationProperties,AccessToken,JObject) est passé de
JObjectàJsonElement. La méthode de remplacement est TwitterHandler.CreateTicketAsync(ClaimsIdentity, AuthenticationProperties, AccessToken, JsonElement).
Catégorie
ASP.NET Core
API affectées
- Microsoft.AspNetCore.Authentication.Facebook
- Microsoft.AspNetCore.Authentication.Google
- Microsoft.AspNetCore.Authentication.MicrosoftAccount
- Microsoft.AspNetCore.Authentication.OAuth
- Microsoft.AspNetCore.Authentication.OpenIdConnect
- Microsoft.AspNetCore.Authentication.Twitter
Authentification : signature OAuthHandler ExchangeCodeAsync modifiée
Dans ASP.NET Core 3.0, la signature de OAuthHandler.ExchangeCodeAsync est passé de :
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(string code, string redirectUri) { throw null; }
Par :
protected virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse> ExchangeCodeAsync(Microsoft.AspNetCore.Authentication.OAuth.OAuthCodeExchangeContext context) { throw null; }
Version introduite
3.0
Ancien comportement
Les chaînes code et redirectUri ont été passées en tant qu’arguments distincts.
Nouveau comportement
Code et RedirectUri sont des propriétés sur OAuthCodeExchangeContext qui peuvent être définies via le constructeur OAuthCodeExchangeContext. Le nouveau type OAuthCodeExchangeContext est le seul argument passé à OAuthHandler.ExchangeCodeAsync.
Raison de la modification
Ce changement permet de fournir des paramètres supplémentaires sans rupture. Il n’est pas nécessaire de créer de nouvelles surcharges ExchangeCodeAsync.
Action recommandée
Construisez un OAuthCodeExchangeContext avec les valeurs code et redirectUri appropriées. Une instance AuthenticationProperties doit être fournie. Cette instance OAuthCodeExchangeContext unique peut être passée à OAuthHandler.ExchangeCodeAsync au lieu de plusieurs arguments.
Catégorie
ASP.NET Core
API affectées
OAuthHandler<TOptions>.ExchangeCodeAsync(String, String)
Autorisation : surcharge AddAuthorization déplacée vers un autre assembly
Les méthodes principales AddAuthorization utilisées pour résider dans Microsoft.AspNetCore.Authorization ont été renommées en AddAuthorizationCore. Les anciennes méthodes AddAuthorization existent toujours, mais se trouvent dans l’assembly Microsoft.AspNetCore.Authorization.Policy à la place. Les applications utilisant les deux méthodes ne doivent voir aucun impact. Notez que Microsoft.AspNetCore.Authorization.Policy est désormais fourni dans l’infrastructure partagée plutôt qu’un package autonome, comme indiqué dans Infrastructure partagée : Assemblys supprimés de Microsoft.AspNetCore.App.
Version introduite
3.0
Ancien comportement
Les méthodes AddAuthorization existaient dans Microsoft.AspNetCore.Authorization.
Nouveau comportement
Les méthodes AddAuthorization existent dans Microsoft.AspNetCore.Authorization.Policy. AddAuthorizationCore est le nouveau nom des anciennes méthodes.
Raison de la modification
AddAuthorization est un meilleur nom de méthode pour l’ajout de tous les services communs nécessaires à l’autorisation.
Action recommandée
Ajoutez une référence à Microsoft.AspNetCore.Authorization.Policy ou utilisez AddAuthorizationCore à la place.
Catégorie
ASP.NET Core
API affectées
Autorisation : IAllowAnonymous supprimé de AuthorizationFilterContext.Filters
Depuis ASP.NET Core 3.0, MVC n’ajoute pas les attributs AllowAnonymousFilters pour pour [AllowAnonymous] qui ont été découverts sur les contrôleurs et les méthodes d’action. Ce changement est traité localement pour les dérivés de AuthorizeAttribute, mais il s’agit d’un changement cassant pour les implémentations IAsyncAuthorizationFilter et IAuthorizationFilter. Ces implémentations inclues dans un wrapper dans un attribut [TypeFilter] sont un moyen populaire et pris en charge d’obtenir une autorisation fortement typée basée sur les attributs lorsque la configuration et l’injection de dépendances sont requises.
Version introduite
3.0
Ancien comportement
IAllowAnonymous est apparu dans la collection AuthorizationFilterContext.Filters. Le test de la présence de l’interface était une approche valide pour remplacer ou désactiver le filtre sur les méthodes de contrôleur individuelles.
Nouveau comportement
IAllowAnonymous n’apparaît plus dans la collection AuthorizationFilterContext.Filters. Les implémentations IAsyncAuthorizationFilter qui dépendent de l’ancien comportement provoquent généralement des réponses HTTP 401 Non autorisé ou HTTP 403 Interdit intermittentes.
Raison de la modification
Une nouvelle stratégie de routage des points de terminaison a été introduite dans ASP.NET Core 3.0.
Action recommandée
Recherchez dans les métadonnées du point de terminaison pour IAllowAnonymous. Par exemple :
var endpoint = context.HttpContext.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
{
}
Un exemple de cette technique est présenté dans cette méthode HasAllowAnonymous.
Catégorie
ASP.NET Core
API affectées
Aucun
Autorisation : les implémentations IAuthorizationPolicyProvider nécessitent une nouvelle méthode
Dans ASP.NET Core 3.0, une nouvelle méthode GetFallbackPolicyAsync a été ajoutée à IAuthorizationPolicyProvider. Cette stratégie de secours est utilisée par l’intergiciel d’autorisation lorsqu’aucune stratégie n’est spécifiée.
Pour plus d’informations, consultez dotnet/aspnetcore#9759.
Version introduite
3.0
Ancien comportement
Les implémentations de IAuthorizationPolicyProvider n’ont pas besoin d’une méthode GetFallbackPolicyAsync.
Nouveau comportement
Les implémentations de IAuthorizationPolicyProvider ont besoin d’une méthode GetFallbackPolicyAsync.
Raison de la modification
Une nouvelle méthode était nécessaire pour être utilisée par le nouveau AuthorizationMiddleware lorsqu’aucune stratégie n’est spécifiée.
Action recommandée
Ajoutez la méthode GetFallbackPolicyAsync à vos implémentations de IAuthorizationPolicyProvider.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
Mise en cache : propriété CompactOnMemoryPressure supprimée
La version ASP.NET Core 3.0 a supprimé les API MemoryCacheOptions obsolètes.
Description de la modification
Ce changement est un suivi de aspnet/Caching#221. Pour en savoir plus, consultez dotnet/extensions#1062.
Version introduite
3.0
Ancien comportement
La propriété MemoryCacheOptions.CompactOnMemoryPressure était disponible.
Nouveau comportement
La propriété MemoryCacheOptions.CompactOnMemoryPressure a été supprimée.
Raison de la modification
Le compactage automatique du cache a provoqué des problèmes. Pour éviter tout comportement inattendu, le cache ne doit être compacté que si nécessaire.
Action recommandée
Pour compacter le cache, effectuez un downcast vers MemoryCache et appelez Compact si nécessaire.
Catégorie
ASP.NET Core
API affectées
MemoryCacheOptions.CompactOnMemoryPressure
Mise en cache : Microsoft.Extensions.Caching.SqlServer utilise le nouveau package SqlClient
Le package Microsoft.Extensions.Caching.SqlServer utilisera le nouveau package Microsoft.Data.SqlClient à la place du package System.Data.SqlClient. Ce changement peut entraîner de légers changements cassants du comportement. Pour plus d’informations, consultez Présentation du nouveau Microsoft.Data.SqlClient.
Version introduite
3.0
Ancien comportement
Le package Microsoft.Extensions.Caching.SqlServer a utilisé le package System.Data.SqlClient.
Nouveau comportement
Microsoft.Extensions.Caching.SqlServer utilise maintenant le package Microsoft.Data.SqlClient.
Raison de la modification
Microsoft.Data.SqlClient est un nouveau package qui est généré à partir de System.Data.SqlClient. C’est là que tout le travail des nouvelles fonctionnalités sera effectué à partir de maintenant.
Action recommandée
Les clients ne doivent pas avoir à s’inquiéter de ce changement cassant, sauf s’ils utilisent des types retournés par le package Microsoft.Extensions.Caching.SqlServer et les castent en types System.Data.SqlClient. Par exemple, si quelqu’un castait un DbConnection vers l’ancien type SqlConnection, il doit remplacer le cast par le nouveau type Microsoft.Data.SqlClient.SqlConnection.
Catégorie
ASP.NET Core
API affectées
Aucun
Mise en cache : les types « pubternal » ResponseCaching sont passés à internes
Dans ASP.NET Core 3.0, les types « pubternal » dans ResponseCaching ont été modifiés en internal.
En outre, les implémentations par défaut de IResponseCachingPolicyProvider et IResponseCachingKeyProvider ne sont plus ajoutées aux services dans le cadre de la méthode AddResponseCaching.
Description de la modification
Dans ASP.NET Core, les types « pubternal » sont déclarés comme public mais résident dans un espace de noms avec le suffixe .Internal. Bien que ces types soient publics, ils n’ont aucune stratégie de support et sont sujets à des changements cassants. Malheureusement, l’utilisation accidentelle de ces types a été fréquente, ce qui a entraîné des changements cassants dans ces projets en limitant la capacité à gérer l’infrastructure.
Version introduite
3.0
Ancien comportement
Ces types étaient visibles publiquement, mais non pris en charge.
Nouveau comportement
Ces types sont désormais internal.
Raison de la modification
L’étendue internal reflète mieux la stratégie non prise en charge.
Action recommandée
Copiez les types utilisés par votre application ou bibliothèque.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.ResponseCaching.Internal.CachedResponseMicrosoft.AspNetCore.ResponseCaching.Internal.CachedVaryByRulesMicrosoft.AspNetCore.ResponseCaching.Internal.IResponseCacheMicrosoft.AspNetCore.ResponseCaching.Internal.IResponseCacheEntryMicrosoft.AspNetCore.ResponseCaching.Internal.IResponseCachingKeyProviderMicrosoft.AspNetCore.ResponseCaching.Internal.IResponseCachingPolicyProviderMicrosoft.AspNetCore.ResponseCaching.Internal.MemoryResponseCacheMicrosoft.AspNetCore.ResponseCaching.Internal.ResponseCachingContextMicrosoft.AspNetCore.ResponseCaching.Internal.ResponseCachingKeyProviderMicrosoft.AspNetCore.ResponseCaching.Internal.ResponseCachingPolicyProvider- Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(RequestDelegate, IOptions<ResponseCachingOptions>, ILoggerFactory, IResponseCachingPolicyProvider, IResponseCache, IResponseCachingKeyProvider)
Protection des données : DataProtection.Blobs utilise de nouvelles API de stockage Azure
Azure.Extensions.AspNetCore.DataProtection.Blobs dépend des bibliothèques de stockage Azure. Ces bibliothèques ont renommé leurs assemblys, packages et espaces de noms. À compter de ASP.NET Core 3.0, Azure.Extensions.AspNetCore.DataProtection.Blobs utilise les nouveaux packages et API avec le préfixe Azure.Storage..
Pour toute question sur les API de stockage Azure, utilisez https://github.com/Azure/azure-storage-net. Pour plus d’informations sur ce problème, consultez dotnet/aspnetcore#19570.
Version introduite
3.0
Ancien comportement
Le package a référencé le package NuGet WindowsAzure.Storage.
Le package référence le package NuGet Microsoft.Azure.Storage.Blob.
Nouveau comportement
Le package référence le package NuGet Azure.Storage.Blob.
Raison de la modification
Ce changement permet à Azure.Extensions.AspNetCore.DataProtection.Blobs de migrer vers les packages de stockage Azure recommandés.
Action recommandée
Si vous devez toujours utiliser les plus anciennes API de stockage Azure avec ASP.NET Core 3.0, ajoutez une dépendance directe au package WindowsAzure.Storage ou Microsoft.Azure.Storage. Ce package peut être installé en même temps que les nouvelles API Azure.Storage.
Dans de nombreux cas, la mise à niveau implique uniquement le changement des instructions using pour utiliser les nouveaux espaces de noms :
- using Microsoft.WindowsAzure.Storage;
- using Microsoft.WindowsAzure.Storage.Blob;
- using Microsoft.Azure.Storage;
- using Microsoft.Azure.Storage.Blob;
+ using Azure.Storage;
+ using Azure.Storage.Blobs;
Catégorie
ASP.NET Core
API affectées
Aucun
Hébergement : AspNetCoreModule V1 supprimé de l’offre groupée d’hébergement Windows
À compter de ASP.NET Core 3.0, l’offre groupée d’hébergement Windows ne contiendra pas AspNetCoreModule (ANCM) V1.
ANCM V2 est rétrocompatible avec ANCM OutOfProcess et est recommandé pour une utilisation avec des applications ASP.NET Core 3.0.
Pour plus d’informations, consultez dotnet/aspnetcore#7095.
Version introduite
3.0
Ancien comportement
ANCM V1 est inclus dans l’offre groupée d’hébergement Windows.
Nouveau comportement
ANCM V1 n’est pas inclus dans l’offre groupée d’hébergement Windows.
Raison de la modification
ANCM V2 est rétrocompatible avec ANCM OutOfProcess et est recommandé pour une utilisation avec des applications ASP.NET Core 3.0.
Action recommandée
Utilisez ANCM V2 avec des applications ASP.NET Core 3.0.
Si ANCM V1 est requis, il peut être installé à l’aide de l’offre groupée d’hébergement Windows ASP.NET Core 2.1 ou 2.2.
Ce changement arrête les applications ASP.NET Core 3.0 qui :
- ont explicitement opté pour l’utilisation d’ANCM V1 avec
<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>; - ont un fichier web.config personnalisé avec
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />.
Catégorie
ASP.NET Core
API affectées
Aucun
Hébergement : l’hôte générique restreint l’injection de constructeur de démarrage
Les seuls types pris en charge par l’hôte générique pour l’injection de constructeur de classe Startup sont IHostEnvironment, IWebHostEnvironment et IConfiguration. Les applications utilisant WebHost ne sont pas affectées.
Description de la modification
Avant ASP.NET Core 3.0, l’injection de constructeur pouvait être utilisée pour des types arbitraires dans le constructeur de la classe Startup. Dans ASP.NET Core 3.0, la pile web a été placée sur une nouvelle plateforme sur la bibliothèque hôte générique. Vous pouvez voir le changement dans le fichier Program.cs des modèles :
ASP.NET Core 2.x :
ASP.NET Core 3.0 :
Host utilise un conteneur d’injection de dépendances (DI) pour générer l’application. WebHost utilise deux conteneurs : un pour l’hôte et un autre pour l’application. Par conséquent, le constructeur Startup ne prend plus en charge l’injection de service personnalisé. Seuls IHostEnvironment, IWebHostEnvironment et IConfiguration peuvent être injectés. Ce changement permet d’éviter les problèmes de l’ID, tels que la création d’un doublon d’un service singleton.
Version introduite
3.0
Raison de la modification
Ce changement est une conséquence du placement sur une nouvelle plateforme de la pile web sur la bibliothèque hôte générique.
Action recommandée
Injectez des services dans la signature de la méthode Startup.Configure. Par exemple :
public void Configure(IApplicationBuilder app, IOptions<MyOptions> options)
Catégorie
ASP.NET Core
API affectées
Aucun
Hébergement : redirection HTTPS activée pour les applications hors processus IIS
La version 13.0.19218.0 du module ASP.NET Core (ANCM) pour l’hébergement via IIS hors processus active une fonctionnalité de redirection HTTPS existante pour les applications ASP.NET Core 3.0 et 2.2.
Pour plus d’informations, consultez dotnet/aspnetcore#15243.
Version introduite
3.0
Ancien comportement
Le modèle de projet ASP.NET Core 2.1 a d’abord introduit le support des méthodes d’intergiciel HTTPS comme UseHttpsRedirection et UseHsts. L’activation de la redirection HTTPS nécessitait l’ajout d’une configuration, car les applications en cours de développement n’utilisent pas le port par défaut 443. La Sécurité du transport strict HTTP (HSTS) est active uniquement si la requête utilise déjà HTTPS. Localhost est ignoré par défaut.
Nouveau comportement
Dans ASP.NET Core 3.0, le scénario HTTPS IIS a été amélioré. Avec l’amélioration, une application peut découvrir les ports HTTPS du serveur et faire fonctionner UseHttpsRedirection par défaut. Le composant in-process a effectué la découverte de ports avec la fonctionnalité IServerAddresses, ce qui affecte uniquement les applications ASP.NET Core 3.0, car la bibliothèque in-process est versionnée avec l’infrastructure. Le composant hors processus a été modifié pour ajouter automatiquement la variable d’environnement ASPNETCORE_HTTPS_PORT. Ce changement a affecté les applications ASP.NET Core 2.2 et 3.0, car le composant hors processus est partagé globalement. Les applications ASP.NET Core 2.1 ne sont pas affectées, car elles utilisent une version antérieure à ANCM par défaut.
Le comportement précédent a été modifié dans ASP.NET Core 3.0.1 et 3.1.0 Préversion 3 pour inverser les changements de comportement dans ASP.NET Core 2.x. Ces changements affectent uniquement les applications hors processus IIS.
Comme indiqué ci-dessus, l’installation de ASP.NET Core 3.0.0 a eu pour effet secondaire d’activer également l’intergiciel UseHttpsRedirection dans les applications ASP.NET Core 2.x. Un changement a été apporté à ANCM dans ASP.NET Core 3.0.1 et 3.1.0 Préversion 3, de telle sorte que leur installation n’ait plus cet effet sur les applications ASP.NET Core 2.x. La variable d’environnement ASPNETCORE_HTTPS_PORT qu’ANCM a renseignée dans ASP.NET Core 3.0.0 a été modifiée en ASPNETCORE_ANCM_HTTPS_PORT dans ASP.NET Core 3.0.1 et 3.1.0 Préversion 3. UseHttpsRedirection a également été mis à jour dans ces versions pour comprendre les variables nouvelles et anciennes. ASP.NET Core 2.x ne sera pas mis à jour. Par conséquent, cela rétablit le comportement précédent de la désactivation par défaut.
Raison de la modification
Amélioration de la fonctionnalité ASP.NET Core 3.0.
Action recommandée
Aucune action n’est requise si vous souhaitez que tous les clients utilisent HTTPS. Pour autoriser certains clients à utiliser HTTP, effectuez l’une des étapes suivantes :
Supprimez les appels vers
UseHttpsRedirectionetUseHstsdepuis la méthodeStartup.Configurede votre projet, puis redéployez l’application.Dans votre fichier web.config, définissez la variable d’environnement
ASPNETCORE_HTTPS_PORTsur une chaîne vide. Ce changement peut se produire directement sur le serveur sans redéployer l’application. Par exemple :<aspNetCore processPath="dotnet" arguments=".\WebApplication3.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" > <environmentVariables> <environmentVariable name="ASPNETCORE_HTTPS_PORT" value="" /> </environmentVariables> </aspNetCore>
UseHttpsRedirection peut toujours être :
- activé manuellement dans ASP.NET Core 2.x en définissant la variable d’environnement
ASPNETCORE_HTTPS_PORTsur le numéro de port approprié (443 dans la plupart des scénarios de production) ; - désactivé dans ASP.NET Core 3.x en définissant
ASPNETCORE_ANCM_HTTPS_PORTavec une valeur de chaîne vide. Cette valeur est définie de la même façon que dans l’exemple précédentASPNETCORE_HTTPS_PORT.
Les machines exécutant des applications ASP.NET Core 3.0.0 doivent installer le runtime ASP.NET Core 3.0.1 avant d’installer l’ANCM ASP.NET Core 3.1.0 Préversion 3. Cela garantit que UseHttpsRedirection continue de fonctionner comme prévu pour les applications ASP.NET Core 3.0.
Dans Azure App Service, ANCM se déploie selon une planification distincte du runtime en raison de sa nature globale. ANCM a été déployé sur Azure avec ces changements après le déploiement de ASP.NET Core 3.0.1 et 3.1.0.
Catégorie
ASP.NET Core
API affectées
HttpsPolicyBuilderExtensions.UseHttpsRedirection(IApplicationBuilder)
Hébergement : types IHostingEnvironment et IApplicationLifetime marqués comme obsolètes et remplacés
De nouveaux types ont été introduits pour remplacer les typesIHostingEnvironment et IApplicationLifetime existants.
Version introduite
3.0
Ancien comportement
Il y avait deux types IHostingEnvironment et IApplicationLifetime différents de Microsoft.Extensions.Hosting et Microsoft.AspNetCore.Hosting.
Nouveau comportement
Les anciens types ont été marqués comme obsolètes et remplacés par de nouveaux types.
Raison de la modification
Lorsque Microsoft.Extensions.Hosting a été introduit dans ASP.NET Core 2.1, certains types comme IHostingEnvironment et IApplicationLifetime ont été copiés à partir de Microsoft.AspNetCore.Hosting. Certains changements de ASP.NET Core 3.0 entraînent l’inclusion des espaces de noms Microsoft.Extensions.Hosting et Microsoft.AspNetCore.Hosting par les applications. Toute utilisation de ces types en double provoque une erreur du compilateur « référence ambiguë » lorsque les deux espaces de noms sont référencés.
Action recommandée
Remplacement de toutes les utilisations des anciens types par les types nouvellement introduits comme ci-dessous :
Types obsolètes (avertissement) :
- Microsoft.Extensions.Hosting.IHostingEnvironment
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.EnvironmentName
Nouveaux types :
- Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment- Microsoft.Extensions.Hosting.IHostApplicationLifetime
- Microsoft.Extensions.Hosting.Environments
Les nouvelles méthodes d’extension IHostEnvironmentIsDevelopment et IsProduction se trouvent dans l’espace de noms Microsoft.Extensions.Hosting. Cet espace de noms doit peut-être être ajouté à votre projet.
Catégorie
ASP.NET Core
API affectées
- Microsoft.AspNetCore.Hosting.EnvironmentName
- Microsoft.AspNetCore.Hosting.IApplicationLifetime
- Microsoft.AspNetCore.Hosting.IHostingEnvironment
- Microsoft.Extensions.Hosting.EnvironmentName
- Microsoft.Extensions.Hosting.IApplicationLifetime
- Microsoft.Extensions.Hosting.IHostingEnvironment
Hébergement : ObjectPoolProvider supprimé des dépendances WebHostBuilder
Afin de rendre ASP.NET Core plus payant, le ObjectPoolProvider a été supprimé de l’ensemble principal de dépendances. Des composants spécifiques qui s’appuient sur ObjectPoolProvider l’ajoutent désormais eux-mêmes.
Pour plus d’informations, consultez dotnet/aspnetcore#5944.
Version introduite
3.0
Ancien comportement
WebHostBuilder fournit ObjectPoolProvider par défaut dans le conteneur DI.
Nouveau comportement
WebHostBuilder ne fournit plus ObjectPoolProvider par défaut dans le conteneur DI.
Raison de la modification
Ce changement a été apporté pour rendre ASP.NET Core plus payant.
Action recommandée
Si votre composant nécessite ObjectPoolProvider, il doit être ajouté à vos dépendances via le IServiceCollection.
Catégorie
ASP.NET Core
API affectées
Aucun
HTTP : extensibilité DefaultHttpContext supprimée
Dans le cadre des améliorations du niveau de performance de ASP.NET Core 3.0, l’extensibilité de DefaultHttpContext a été supprimée. La classe est maintenant sealed. Pour plus d’informations, consultez dotnet/aspnetcore#6504.
Si vos tests unitaires utilisent Mock<DefaultHttpContext>, utilisez Mock<HttpContext> ou new DefaultHttpContext() à la place.
Pour plus d’informations, consultez dotnet/aspnetcore#6534.
Version introduite
3.0
Ancien comportement
Les classes peuvent dériver de DefaultHttpContext.
Nouveau comportement
Les classes ne peuvent pas dériver de DefaultHttpContext.
Raison de la modification
L’extensibilité a été initialement fournie pour permettre le regroupement du HttpContext, mais elle a introduit une complexité inutile et entravé d’autres optimisations.
Action recommandée
Si vous utilisez Mock<DefaultHttpContext> dans vos tests unitaires, commencez à utiliser Mock<HttpContext> à la place.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Http.DefaultHttpContext
HTTP : les constantes HeaderNames sont passées à des champs statiques en lecture seule
À compter de ASP.NET Core 3.0 Préversion 5, les champs dans Microsoft.Net.Http.Headers.HeaderNames sont passés de const à static readonly.
Pour plus d’informations, consultez dotnet/aspnetcore#9514.
Version introduite
3.0
Ancien comportement
Ces champs étaient const auparavant.
Nouveau comportement
Ces champs sont désormais static readonly.
Raison de la modification
Changements :
- Empêche l’incorporation des valeurs au-delà des limites de l’assembly, ce qui permet des corrections de valeur en fonction des besoins.
- Permet des vérifications d’égalité des références plus rapides.
Action recommandée
Recompilez sur 3.0. Le code source utilisant ces champs des manières suivantes ne peut plus le faire :
- en tant qu’argument d’attribut
- En tant que
casedans une instructionswitch - lors de la définition d’un autre
const
Pour contourner le changement cassant, basculez vers l’utilisation de constantes de noms d’en-tête autodéfinis ou de littéraux de chaîne.
Catégorie
ASP.NET Core
API affectées
Microsoft.Net.Http.Headers.HeaderNames
HTTP : changements de l’infrastructure du corps de la réponse
L’infrastructure qui supporte un corps de réponse HTTP a changé. Si vous utilisez HttpResponse directement, vous n’avez pas besoin d’apporter de changements de code. Lisez plus en détail si vous incluez dans un wrapper ou remplacez HttpResponse.Body ou si vous accédez à HttpContext.Features.
Version introduite
3.0
Ancien comportement
Trois API étaient associées au corps de la réponse HTTP :
IHttpResponseFeature.BodyIHttpSendFileFeature.SendFileAsyncIHttpBufferingFeature.DisableResponseBuffering
Nouveau comportement
Si vous remplacez HttpResponse.Body, il remplace IHttpResponseBodyFeature en entier par un wrapper autour de votre flux donné à l’aide de StreamResponseBodyFeature pour fournir des implémentations par défaut pour toutes les API attendues. La restauration du flux d’origine rétablit ce changement.
Raison de la modification
La motivation est de combiner les API du corps de la réponse dans une nouvelle interface de fonctionnalité unique.
Action recommandée
Utilisez IHttpResponseBodyFeature là où vous utilisiez IHttpResponseFeature.Body, IHttpSendFileFeature ou IHttpBufferingFeature précédemment.
Catégorie
ASP.NET Core
API affectées
- Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature
- Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.Body
- Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature
HTTP : Certaines valeurs par défaut du cookie SameSite ont été remplacées par Aucune
SameSite est une option pour les cookies permettant d’atténuer certaines attaques de falsification de requêtes intersites (CSRF, Cross Site Request Forgery). Lors de l’introduction initiale de cette option, des valeurs par défaut incohérentes étaient utilisées dans différentes API ASP.NET Core. L’incohérence a conduit à des résultats confus. À partir de ASP.NET Core 3.0, ces valeurs par défaut sont mieux alignées. Vous devez choisir cette fonctionnalité par composant.
Version introduite
3.0
Ancien comportement
Des API similaires ASP.NET Core utilisaient des valeurs par défaut SameSiteMode différentes. Un exemple de l’incohérence est observé dans HttpResponse.Cookies.Append(String, String) et HttpResponse.Cookies.Append(String, String, CookieOptions), qui ont respectivement la valeur par défaut SameSiteMode.None et SameSiteMode.Lax.
Nouveau comportement
La valeur par défaut de toutes les API affectées est SameSiteMode.None.
Raison de la modification
La valeur par défaut a été modifiée pour faire de SameSite une fonctionnalité d’activation.
Action recommandée
Chaque composant qui émet des cookies doit décider si SameSite convient à ses scénarios. Évaluez votre utilisation des API affectées et reconfigurez SameSite en fonction des besoins.
Catégorie
ASP.NET Core
API affectées
HTTP : E/S synchrones désactivées sur tous les serveurs
À compter de ASP.NET Core 3.0, les opérations de serveur synchrone sont désactivées par défaut.
Description de la modification
AllowSynchronousIO est une option dans chaque serveur qui active ou désactive les API d’E/S synchrones comme HttpRequest.Body.Read, HttpResponse.Body.Write et Stream.Flush. Ces API ont longtemps été une source de privation de threads et de blocages d’applications. À compter de ASP.NET Core 3.0 Préversion 3, ces opérations synchrones sont désactivées par défaut.
Serveurs affectés :
- Kestrel
- HttpSys
- IIS in-process
- Serveur de Test
Attendez-vous aux erreurs suivantes :
Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.Synchronous operations are disallowed. Call FlushAsync or set AllowSynchronousIO to true instead.
Chaque serveur a une option AllowSynchronousIO qui contrôle ce comportement et la valeur par défaut pour tous les serveurs est désormais false.
Le comportement peut également être remplacé sur demande en tant qu’atténuation temporaire. Par exemple :
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Si vous rencontrez des problèmes avec un TextWriter ou un autre flux appelant une API synchrone dans Dispose, appelez la nouvelle API DisposeAsync à la place.
Pour plus d’informations, consultez dotnet/aspnetcore#7644.
Version introduite
3.0
Ancien comportement
Par défaut, HttpRequest.Body.Read, HttpResponse.Body.Write et Stream.Flush sont autorisés.
Nouveau comportement
Ces API synchrones ne sont pas autorisées par défaut :
Attendez-vous aux erreurs suivantes :
Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.Synchronous operations are disallowed. Call FlushAsync or set AllowSynchronousIO to true instead.
Raison de la modification
Ces API synchrones ont longtemps été une source de privation de threads et de blocages d’applications. À compter de ASP.NET Core 3.0 Préversion 3, les opérations synchrones sont désactivées par défaut.
Action recommandée
Utilisez les versions asynchrones des méthodes. Le comportement peut également être remplacé sur demande en tant qu’atténuation temporaire.
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
Catégorie
ASP.NET Core
API affectées
Identité : surcharge de la méthode AddDefaultUI supprimée
À compter de ASP.NET Core 3.0, la surcharge de méthode IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework) n’existe plus.
Version introduite
3.0
Raison de la modification
Ce changement est le résultat de l’adoption de la fonctionnalité de ressources web statiques.
Action recommandée
Appelez IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder) au lieu de la surcharge qui prend deux arguments. Si vous utilisez Bootstrap 3, ajoutez également la ligne suivante à un élément <PropertyGroup> dans votre fichier projet :
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Catégorie
ASP.NET Core
API affectées
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder,UIFramework)
Identité : la version Bootstrap par défaut de l’interface utilisateur a été modifiée
À compter de ASP.NET Core 3.0, l’interface utilisateur d’identité utilise par défaut la version 4 de Bootstrap.
Version introduite
3.0
Ancien comportement
L’appel de méthode services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(); était le même que services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Nouveau comportement
L’appel de méthode services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(); est le même que services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap4);
Raison de la modification
Bootstrap 4 a été mis en production pendant la période ASP.NET Core 3.0.
Action recommandée
Vous êtes concerné par ce changement si vous utilisez l’interface utilisateur d’identité par défaut et que vous l’avez ajoutée dans Startup.ConfigureServices, comme illustré dans l’exemple suivant :
services.AddDefaultIdentity<IdentityUser>().AddDefaultUI();
Effectuez l'une des opérations suivantes :
Migrez votre application pour utiliser Bootstrap 4 à l’aide de son guide de migration.
Mettre à jour
Startup.ConfigureServicespour appliquer l’utilisation de Bootstrap 3. Par exemple :services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap3);
Catégorie
ASP.NET Core
API affectées
Aucun
Identité : SignInAsync lève l’exception pour l’identité non authentifiée
Par défaut, SignInAsync lève une exception pour les principaux/identités dans laquelle IsAuthenticated est false.
Version introduite
3.0
Ancien comportement
SignInAsync accepte tous les principaux/identités, y compris les identités dans lesquelles IsAuthenticated est false.
Nouveau comportement
Par défaut, SignInAsync lève une exception pour les principaux/identités dans laquelle IsAuthenticated est false. Il existe un nouvel indicateur pour supprimer ce comportement, mais le comportement par défaut a changé.
Raison de la modification
L’ancien comportement était problématique, car, par défaut, ces principaux étaient rejetés par [Authorize] / RequireAuthenticatedUser().
Action recommandée
Dans ASP.NET Core 3.0 Préversion 6, il existe un indicateur RequireAuthenticatedSignIn sur AuthenticationOptions qui est true par défaut. Définissez cet indicateur sur false pour restaurer l’ancien comportement.
Catégorie
ASP.NET Core
API affectées
Aucun
Identité : le constructeur SignInManager accepte le nouveau paramètre
À compter de ASP.NET Core 3.0, un nouveau paramètre IUserConfirmation<TUser> a été ajouté au constructeur SignInManager. Pour plus d’informations, consultez dotnet/aspnetcore#8356.
Version introduite
3.0
Raison de la modification
La motivation du changement était d’ajouter le support des nouveaux flux d’e-mail/confirmation dans l’identité.
Action recommandée
Si vous construisez manuellement un SignInManager, fournissez une implémentation de IUserConfirmation ou récupérez-en une à partir de l’injection de dépendances à fournir.
Catégorie
ASP.NET Core
API affectées
Identité : l’interface utilisateur utilise la fonctionnalité de ressources web statiques
ASP.NET Core 3.0 a introduit une fonctionnalité de ressources web statiques et l’interface utilisateur d’identité l’a adoptée.
Description de la modification
Suite à l’adoption par l’interface utilisateur d’identité de la fonctionnalité des ressources web statiques :
- La sélection de l’infrastructure s’effectue à l’aide de la propriété
IdentityUIFrameworkVersiondans votre fichier projet. - Bootstrap 4 est l’infrastructure d’interface utilisateur par défaut pour l’interface utilisateur Identité. Bootstrap 3 a atteint sa fin de vie et vous devez envisager de migrer vers une version prise en charge.
Version introduite
3.0
Ancien comportement
L’infrastructure d’interface utilisateur par défaut pour l’interface utilisateur Identité était Bootstrap 3. L’infrastructure de l’interface utilisateur peut être configurée à l’aide d’un paramètre pour l’appel de méthode AddDefaultUI dans Startup.ConfigureServices.
Nouveau comportement
L’infrastructure d’interface utilisateur par défaut pour l’interface utilisateur Identité est Bootstrap 4. L’infrastructure de l’interface utilisateur doit être configurée dans votre fichier projet, au lieu de celle dans l’appel de méthode AddDefaultUI.
Raison de la modification
L’adoption de la fonctionnalité de ressources web statiques exige que la configuration de l’infrastructure de l’interface utilisateur passe à MSBuild. La décision sur l’infrastructure à incorporer est à prendre au moment de la génération. Ce n’est pas une décision de runtime.
Action recommandée
Consultez l’interface utilisateur de votre site pour vous assurer que les nouveaux composants Bootstrap 4 sont compatibles. Si nécessaire, utilisez la propriété MSBuild IdentityUIFrameworkVersion pour revenir à la dernière version de Bootstrap 3. Ajoutez la propriété à un élément <PropertyGroup> dans votre fichier projet :
<IdentityUIFrameworkVersion>Bootstrap3</IdentityUIFrameworkVersion>
Catégorie
ASP.NET Core
API affectées
IdentityBuilderUIExtensions.AddDefaultUI(IdentityBuilder, UIFramework)
Kestrel : adaptateurs de connexion supprimés
Dans le cadre du déplacement des API « pubternal » vers public, le concept d’un IConnectionAdapter a été supprimé de Kestrel. Les adaptateurs de connexion sont remplacés par un intergiciel de connexion (similaire au middleware HTTP dans le pipeline ASP.NET Core, mais pour les connexions de niveau inférieur). HTTPS et la journalisation des connexions sont passés des adaptateurs de connexion à l’intergiciel de connexion. Ces méthodes d’extension doivent continuer à fonctionner en toute transparence, mais les détails de l’implémentation ont changé.
Pour plus d’informations, consultez dotnet/aspnetcore#11412. Pour plus d’informations, consultez dotnet/aspnetcore#11475.
Version introduite
3.0
Ancien comportement
Les composants d’extensibilité Kestrel ont été créés à l’aide de IConnectionAdapter.
Nouveau comportement
Les composants d’extensibilité Kestrel sont créés en tant qu’intergiciel.
Raison de la modification
Ce changement est destiné à fournir une architecture d’extensibilité plus flexible.
Action recommandée
Convertissez toutes les implémentations de IConnectionAdapter afin d'utiliser le nouveau patron d’intergiciel, comme indiqué dans dotnet/aspnetcore#11412.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter
Kestrel : assembly HTTPS vide supprimé
L’assembly Microsoft.AspNetCore.Server.Kestrel.Https a été supprimé.
Version introduite
3.0
Raison de la modification
Dans ASP.NET Core 2.1, le contenu de Microsoft.AspNetCore.Server.Kestrel.Https a été déplacé vers Microsoft.AspNetCore.Server.Kestrel.Core. Ce changement n’était pas un changement cassant, il a été effectué à l’aide des attributs [TypeForwardedTo].
Action recommandée
- Les bibliothèques faisant référence à
Microsoft.AspNetCore.Server.Kestrel.Https2.0 doivent mettre à jour toutes les dépendances ASP.NET Core vers la version 2.1 ou ultérieure. Sinon, elles peuvent s’arrêter lorsqu’elles sont chargées dans une application ASP.NET Core 3.0. - Les applications et bibliothèques ciblant ASP.NET Core 2.1 et versions ultérieures doivent supprimer toutes les références directes au package NuGet
Microsoft.AspNetCore.Server.Kestrel.Https.
Catégorie
ASP.NET Core
API affectées
Aucun
Kestrel : les en-têtes de codes de fin des requêtes ont été déplacés vers la nouvelle collection
Dans les versions antérieures, Kestrel a ajouté des en-têtes de codes de fin segmentés HTTP/1.1 dans la collection d’en-têtes des requêtes lorsque le corps de la requête a été lu jusqu’au bout. Ce comportement a suscité des préoccupations concernant l’ambiguïté entre les en-têtes et les codes de fin. La décision a été prise de déplacer les codes de fin vers une nouvelle collection.
Les codes de fin des requêtes HTTP/2 n’étaient pas disponibles dans ASP.NET Core 2.2, mais ils sont désormais disponibles dans cette nouvelle collection dans ASP.NET Core 3.0.
De nouvelles méthodes d’extension de requêtes ont été ajoutées pour accéder à ces codes de fin.
Les codes de fin HTTP/1.1 sont disponibles une fois que l’ensemble du corps de la requête a été lu.
Les codes de fin HTTP/2 sont disponibles une fois qu’ils sont envoyés par le client. Le client n’envoie pas les codes de fin tant que le corps de la requête n’a pas été mis en mémoire tampon par le serveur. Vous devrez peut-être lire le corps de la demande pour libérer de l’espace tampon. Les codes de fin sont toujours disponibles si vous lisez le corps de la demande jusqu’au bout. Les codes de fin marquent la fin du corps.
Version introduite
3.0
Ancien comportement
Les en-têtes de code de fin des requêtes sont ajoutés à la collection HttpRequest.Headers.
Nouveau comportement
Les en-têtes de codes de fin des requêtes ne sont pas présents dans la collection HttpRequest.Headers. Utilisez les méthodes d’extension suivantes sur HttpRequest pour y accéder :
-
GetDeclaredTrailers(): obtient l’en-tête « Code de fin » des requêtes qui répertorie les codes de fin à attendre après le corps. -
SupportsTrailers(): indique si la requête prend en charge la réception des en-têtes de codes de fin. -
CheckTrailersAvailable(): détermine si la requête prend en charge les codes de fin et s’ils sont disponibles pour la lecture. -
GetTrailer(string trailerName): obtient l’en-tête du code de fin demandé à partir de la réponse.
Raison de la modification
Les codes de fin sont une fonctionnalité clé dans des scénarios tels que gRPC. La fusion des codes de fin pour des en-têtes de demande a dérouté les utilisateurs.
Action recommandée
Utilisez les méthodes d’extension associées au code de fin sur HttpRequest pour accéder aux codes de fin.
Catégorie
ASP.NET Core
API affectées
Kestrel : abstractions de transport supprimées et rendues publiques
Dans le cadre de l’éloignement des API « pubternal », les API de couche de transport Kestrel sont exposées en tant qu’interface publique dans la bibliothèque Microsoft.AspNetCore.Connections.Abstractions.
Version introduite
3.0
Ancien comportement
- Des abstractions liées au transport étaient disponibles dans la bibliothèque
Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions. - La propriété
ListenOptions.NoDelayétait disponible.
Nouveau comportement
- L’interface
IConnectionListenera été introduite dans la bibliothèqueMicrosoft.AspNetCore.Connections.Abstractionspour exposer les fonctionnalités les plus utilisées de la bibliothèque...Transport.Abstractions. - Le
NoDelayest désormais disponible dans les options de transport (LibuvTransportOptionsetSocketTransportOptions). -
SchedulingModen’est plus disponible.
Raison de la modification
ASP.NET Core 3.0 a été retiré des API « pubternal ».
Action recommandée
Catégorie
ASP.NET Core
API affectées
Aucun
Localisation : ResourceManagerWithCultureStringLocalizer et WithCulture marqués comme obsolètes
La classe ResourceManagerWithCultureStringLocalizer et le membre de l’interface WithCulture sont souvent des sources de confusion pour les utilisateurs de la localisation, en particulier lors de la création de leur propre implémentation IStringLocalizer. Ces éléments donnent à l’utilisateur l’impression qu’une instance IStringLocalizer est « par langage, par ressource ». En réalité, les instances doivent uniquement être « par ressource ». Le langage recherché est déterminé par le CultureInfo.CurrentUICulture au moment de l’exécution. Pour éliminer la source de confusion, les API ont été marquées comme obsolètes dans ASP.NET Core 3.0. Les API seront supprimées dans une version ultérieure.
Pour connaître le contexte, consultez dotnet/aspnetcore#3324. Pour plus d’informations, consultez dotnet/aspnetcore#7756.
Version introduite
3.0
Ancien comportement
Les méthodes n’ont pas été marquées comme Obsolete.
Nouveau comportement
Les méthodes sont marquées Obsolete.
Raison de la modification
Les API représentaient un cas d’usage qui n’est pas recommandé. Il y avait une confusion au sujet de la conception de la localisation.
Action recommandée
La recommandation est d’utiliser ResourceManagerStringLocalizer à la place. Laissez la culture être définie par le CurrentCulture. Si ce n’est pas une option, créez et utilisez une copie de ResourceManagerWithCultureStringLocalizer.
Catégorie
ASP.NET Core
API affectées
Microsoft.Extensions.Localization.ResourceManagerWithCultureStringLocalizerMicrosoft.Extensions.Localization.ResourceManagerStringLocalizer.WithCulture
Journalisation : la classe DebugLogger est devenue interne
Avant ASP.NET Core 3.0, le modificateur d’accès de DebugLogger était public. Dans ASP.NET Core 3.0, le modificateur d’accès est passé à internal.
Version introduite
3.0
Raison de la modification
Le changement est apporté à :
- Appliquez la cohérence avec d’autres implémentations de l’enregistreur d’événements, telles que
ConsoleLogger. - Réduisez la surface de l’API.
Action recommandée
Utilisez la méthode d’extension AddDebugILoggingBuilder pour activer la journalisation de débogage. DebugLoggerProvider est également toujours public dans le cas où le service doit être inscrit manuellement.
Catégorie
ASP.NET Core
API affectées
Microsoft.Extensions.Logging.Debug.DebugLogger
MVC : suffixe asynchrone découpé des noms d’action du contrôleur
Dans le cadre de l’adressage dotnet/aspnetcore#4849, ASP.NET Core MVC découpe le suffixe Async des noms d’action par défaut. À compter de ASP.NET Core 3.0, ce changement affecte à la fois le routage et la génération de liens.
Version introduite
3.0
Ancien comportement
Prenez en compte le contrôleur MVC ASP.NET Core suivant :
public class ProductController : Controller
{
public async IActionResult ListAsync()
{
var model = await DbContext.Products.ToListAsync();
return View(model);
}
}
L’action est routable via Product/ListAsync. La génération de liens nécessite la spécification du suffixe Async. Par exemple :
<a asp-controller="Product" asp-action="ListAsync">List</a>
Nouveau comportement
Dans ASP.NET Core 3.0, l’action est routable via Product/List. Le code de génération de lien doit omettre le suffixe Async. Par exemple :
<a asp-controller="Product" asp-action="List">List</a>
Ce changement n’affecte pas les noms spécifiés à l’aide de l’attribut [ActionName]. Le nouveau comportement peut être désactivé en définissant MvcOptions.SuppressAsyncSuffixInActionNamesfalse sur Startup.ConfigureServices :
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Raison de la modification
Par convention, les méthodes .NET asynchrones contiennent le suffixe Async. Toutefois, lorsqu’une méthode définit une action MVC, il n’est pas souhaitable d’utiliser le suffixe Async.
Action recommandée
Si votre application dépend des actions MVC qui préservent le suffixe Async du nom, choisissez l’une des atténuations suivantes :
- Utilisez l’attribut
[ActionName]pour conserver le nom d’origine. - Désactivez entièrement le renommage en définissant
MvcOptions.SuppressAsyncSuffixInActionNamessurfalsedansStartup.ConfigureServices:
services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Catégorie
ASP.NET Core
API affectées
Aucun
MVC : JsonResult déplacé vers Microsoft.AspNetCore.Mvc.Core
JsonResult a été déplacé vers l’assembly Microsoft.AspNetCore.Mvc.Core. Ce type était utilisé pour être défini dans Microsoft.AspNetCore.Mvc.Formatters.Json. Un attribut [TypeForwardedTo] au niveau de l’assembly a été ajouté àMicrosoft.AspNetCore.Mvc.Formatters.Json pour résoudre ce problème pour la majorité des utilisateurs. Les applications qui utilisent des bibliothèques tierces peuvent rencontrer des problèmes.
Version introduite
3.0 Préversion 6
Ancien comportement
Une application utilisant une bibliothèque basée sur la version 2.2 est générée avec succès.
Nouveau comportement
Une application utilisant une bibliothèque 2.2 échoue à la compilation. Une erreur contenant une variante du texte suivant est fournie :
The type 'JsonResult' exists in both 'Microsoft.AspNetCore.Mvc.Core, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' and 'Microsoft.AspNetCore.Mvc.Formatters.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
Pour obtenir un exemple de ce type de problème, consultez dotnet/aspnetcore#7220.
Raison de la modification
Changements au niveau de la plateforme de la composition des ASP.NET Core comme décrit dans aspnet/Announcements#325.
Action recommandée
Les bibliothèques compilées sur la version 2.2 de Microsoft.AspNetCore.Mvc.Formatters.Json peuvent devoir être recompilées pour résoudre le problème pour tous les contrôles serveur consommateur. S’il est concerné, contactez l’auteur de la bibliothèque. Demandez la recompilation de la bibliothèque pour cibler ASP.NET Core 3.0.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Mvc.JsonResult
MVC : outil de précompilation déconseillé
Dans ASP.NET Core 1.1, le package Microsoft.AspNetCore.Mvc.Razor.ViewCompilation (outil de précompilation MVC) a été introduit pour ajouter le support de la compilation au moment de la publication des fichiers Razor (fichiers .cshtml). Dans ASP.NET Core 2.1, le Kit de développement logiciel (SDK) Razor a été introduit pour développer les fonctionnalités de l’outil de précompilation. Le Kit de développement logiciel (SDK) Razor a ajouté le support de la compilation au moment de la génération et de la publication des fichiers Razor. Le Kit de développement logiciel (SDK) vérifie l’exactitude des fichiers .cshtml au moment de la génération tout en s’améliorant au moment du démarrage de l’application. Le Kit de développement logiciel (SDK) Razor est activé par défaut et aucun mouvement n’est nécessaire pour commencer à l’utiliser.
Dans ASP.NET Core 3.0, l’outil de précompilation MVC 1.1-era ASP.NET Core a été supprimé. Les versions de package antérieures continueront de recevoir des patches importants de bogues et de sécurité dans la mise en production du patch.
Version introduite
3.0
Ancien comportement
Le package Microsoft.AspNetCore.Mvc.Razor.ViewCompilation a été utilisé pour précompiler les affichages Razor MVC.
Nouveau comportement
Le Kit de développement logiciel (SDK) Razor prend en charge cette fonctionnalité en mode natif. Le package Microsoft.AspNetCore.Mvc.Razor.ViewCompilation n’est plus mis à jour.
Raison de la modification
Le Kit de développement logiciel (SDK) Razor fournit davantage de fonctionnalités et vérifie l’exactitude des fichiers .cshtml au moment de la génération. Le Kit de développement logiciel (SDK) améliore également le temps de démarrage de l’application.
Action recommandée
Pour les utilisateurs de ASP.NET Core 2.1 ou version ultérieure, mettez à jour pour utiliser le support native de la précompilation dans le Kit de développement logiciel (SDK) Razor. Si des bogues ou des fonctionnalités manquantes empêchent la migration vers le Kit de développement logiciel (SDK) Razor, ouvrez un problème sur dotnet/aspnetcore.
Catégorie
ASP.NET Core
API affectées
Aucun
MVC : les types « pubternal » sont passés à internes
Dans ASP.NET Core 3.0, tous les types « pubternal » dans MVC ont été mis à jour pour être public dans un espace de noms pris en charge ou internal le cas échéant.
Description de la modification
Dans ASP.NET Core, les types « pubternal » sont déclarés comme public mais résident dans un espace de noms avec le suffixe .Internal. Bien que ces types soient public, ils n’ont aucune stratégie de support et sont sujets à des changements cassants. Malheureusement, l’utilisation accidentelle de ces types a été fréquente, ce qui a entraîné des changements cassants dans ces projets en limitant la capacité à gérer l’infrastructure.
Version introduite
3.0
Ancien comportement
Certains types dans MVC étaient public mais dans un espace de noms .Internal. Ces types n’avaient aucune stratégie de support et étaient sujets à des changements cassants.
Nouveau comportement
Tous ces types sont mis à jour pour être public dans un espace de noms pris en charge ou marqués comme internal.
Raison de la modification
L’utilisation accidentelle de ces types « pubternal » a été fréquente, ce qui a entraîné des changements cassants dans ces projets en limitant la capacité à gérer l’infrastructure.
Action recommandée
Si vous utilisez des types qui sont devenus vraiment public et qui ont été déplacés vers un nouvel espace de noms pris en charge, mettez à jour vos références pour qu’elles correspondent aux nouveaux espaces de noms.
Si vous utilisez des types qui ont été marqués comme internal, vous devez trouver une alternative. Les types « pubternal » précédents n’étaient jamais pris en charge pour un usage public. S’il existe des types spécifiques dans ces espaces de noms qui sont critiques pour vos applications, signalez un problème sur dotnet/aspnetcore. Des considérations peuvent être prises en compte pour créer les types public demandés.
Catégorie
ASP.NET Core
API affectées
Ce changement inclut les types dans les espaces de noms suivants :
Microsoft.AspNetCore.Mvc.Cors.InternalMicrosoft.AspNetCore.Mvc.DataAnnotations.InternalMicrosoft.AspNetCore.Mvc.Formatters.InternalMicrosoft.AspNetCore.Mvc.Formatters.Json.InternalMicrosoft.AspNetCore.Mvc.Formatters.Xml.InternalMicrosoft.AspNetCore.Mvc.InternalMicrosoft.AspNetCore.Mvc.ModelBinding.InternalMicrosoft.AspNetCore.Mvc.Razor.InternalMicrosoft.AspNetCore.Mvc.RazorPages.InternalMicrosoft.AspNetCore.Mvc.TagHelpers.InternalMicrosoft.AspNetCore.Mvc.ViewFeatures.Internal
MVC : le shim de compatibilité de l’API web a été supprimé
À compter de ASP.NET Core 3.0, le package Microsoft.AspNetCore.Mvc.WebApiCompatShim n’est plus disponible.
Description de la modification
Le package Microsoft.AspNetCore.Mvc.WebApiCompatShim (WebApiCompatShim) fournit une compatibilité partielle dans ASP.NET Core avec ASP.NET API Web 4.x 2 pour simplifier la migration des implémentations d’API web existantes vers ASP.NET Core. Toutefois, les applications qui utilisent WebApiCompatShim ne bénéficient pas des fonctionnalités liées à l’API qui sont livrées dans les versions récentes ASP.NET Core. Ces fonctionnalités incluent l’amélioration de la génération de spécifications Open API, la gestion standardisée des erreurs et la génération du code client. Pour mieux concentrer les efforts de l’API dans la version 3.0, WebApiCompatShim a été supprimé. Les applications existantes utilisant WebApiCompatShim doivent migrer vers le modèle [ApiController] plus récent.
Version introduite
3.0
Raison de la modification
Le shim de compatibilité de l’API web était un outil de migration. Il limite l’accès utilisateur aux nouvelles fonctionnalités ajoutées dans ASP.NET Core.
Action recommandée
Supprimez l’utilisation de ce shim et migrez directement vers les fonctionnalités similaires dans ASP.NET Core lui-même.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Mvc.WebApiCompatShim
Razor : API RazorTemplateEngine supprimée
L’API RazorTemplateEngine a été supprimée et remplacée par Microsoft.AspNetCore.Razor.Language.RazorProjectEngine.
Pour plus d’informations, consultez le problème GitHub dotnet/aspnetcore#25215.
Version introduite
3.0
Ancien comportement
Un moteur de modèle peut être créé et utilisé pour analyser et générer du code pour les fichiers Razor.
Nouveau comportement
RazorProjectEngine peut être créé avec le même type d’informations que RazorTemplateEngine pour analyser et générer du code pour les fichiers Razor. RazorProjectEngine fournit également des niveaux de configuration supplémentaires.
Raison de la modification
RazorTemplateEngine était trop étroitement couplé aux implémentations existantes. Ce couplage serré a conduit à plus de questions lors de la tentative de configurer correctement un pipeline d’analyse/génération Razor.
Action recommandée
Utilisez RazorProjectEngine au lieu de RazorTemplateEngine. Voici quelques exemples.
Créer et configurer RazorProjectEngine
RazorProjectEngine projectEngine =
RazorProjectEngine.Create(RazorConfiguration.Default,
RazorProjectFileSystem.Create(@"C:\source\repos\ConsoleApp4\ConsoleApp4"),
builder =>
{
builder.ConfigureClass((document, classNode) =>
{
classNode.ClassName = "MyClassName";
// Can also configure other aspects of the class here.
});
// More configuration can go here
});
Générer du code pour un fichier Razor
RazorProjectItem item = projectEngine.FileSystem.GetItem(
@"C:\source\repos\ConsoleApp4\ConsoleApp4\Example.cshtml",
FileKinds.Legacy);
RazorCodeDocument output = projectEngine.Process(item);
// Things available
RazorSyntaxTree syntaxTree = output.GetSyntaxTree();
DocumentIntermediateNode intermediateDocument =
output.GetDocumentIntermediateNode();
RazorCSharpDocument csharpDocument = output.GetCSharpDocument();
Catégorie
ASP.NET Core
API affectées
RazorTemplateEngineRazorTemplateEngineOptions
Razor : compilation du runtime déplacée vers un package
Le support de la compilation du runtime des affichages Razor et des pages Razor a été déplacée vers un package distinct.
Version introduite
3.0
Ancien comportement
La compilation runtime est disponible sans avoir besoin de packages supplémentaires.
Nouveau comportement
La fonctionnalité a été déplacée vers le package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Les API suivantes étaient précédemment disponibles dans Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions pour prendre en charge la compilation du runtime. Les API sont désormais disponibles via Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.MvcRazorRuntimeCompilationOptions.
-
RazorViewEngineOptions.FileProvidersest maintenantMvcRazorRuntimeCompilationOptions.FileProviders -
RazorViewEngineOptions.AdditionalCompilationReferencesest maintenantMvcRazorRuntimeCompilationOptions.AdditionalReferencePaths
En outre, Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions.AllowRecompilingViewsOnFileChange a été supprimé. La recompilation sur les changements de fichier est activée par défaut en référençant le package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
Raison de la modification
Ce changement était nécessaire pour supprimer la dépendance de l’infrastructure partagée ASP.NET Core envers Roslyn.
Action recommandée
Les applications qui nécessitent une compilation ou une recompilation du runtime de fichiers Razor doivent effectuer les étapes suivantes :
Ajouter une référence au package
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Mettre à jour la méthode
Startup.ConfigureServicesdu projet pour inclure un appel àAddRazorRuntimeCompilation. Par exemple :services.AddMvc() .AddRazorRuntimeCompilation();
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
État de session : API obsolètes supprimées
Les API obsolètes pour la configuration des cookies de session ont été supprimées. Pour plus d’informations, consultez aspnet/Announcements#257.
Version introduite
3.0
Raison de la modification
Ce changement applique la cohérence entre les API pour la configuration des fonctionnalités qui utilisent des cookies.
Action recommandée
Migrez l’utilisation des API supprimées vers leurs remplacements plus récents. Prenons l’exemple suivant dans Startup.ConfigureServices :
public void ConfigureServices(ServiceCollection services)
{
services.AddSession(options =>
{
// Removed obsolete APIs
options.CookieName = "SessionCookie";
options.CookieDomain = "contoso.com";
options.CookiePath = "/";
options.CookieHttpOnly = true;
options.CookieSecure = CookieSecurePolicy.Always;
// new API
options.Cookie.Name = "SessionCookie";
options.Cookie.Domain = "contoso.com";
options.Cookie.Path = "/";
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
}
Catégorie
ASP.NET Core
API affectées
- Microsoft.AspNetCore.Builder.SessionOptions.CookieDomain
- Microsoft.AspNetCore.Builder.SessionOptions.CookieHttpOnly
- Microsoft.AspNetCore.Builder.SessionOptions.CookieName
- Microsoft.AspNetCore.Builder.SessionOptions.CookiePath
- Microsoft.AspNetCore.Builder.SessionOptions.CookieSecure
Infrastructure partagée : les assemblys supprimés de Microsoft.AspNetCore.App
À compter de ASP.NET Core 3.0, l’infrastructure partagée ASP.NET Core (Microsoft.AspNetCore.App) contient uniquement des assemblys internes entièrement développés, pris en charge et pouvant être gérés par Microsoft.
Description de la modification
Considérez le changement comme la redéfinition des limites de la « plateforme » ASP.NET Core. L’infrastructure partagée sera compilable par la source par n’importe qui via GitHub et continuera d’offrir les avantages existants des infrastructures partagées .NET Core à vos applications. Certains avantages incluent une taille de déploiement plus petite, une mise à jour corrective centralisée et un temps de démarrage plus rapide.
Dans le cadre du changement, certains changements cassants notables sont introduits dans Microsoft.AspNetCore.App.
Version introduite
3.0
Ancien comportement
Projets référencés Microsoft.AspNetCore.App via un élément <PackageReference> dans le fichier projet.
En outre, Microsoft.AspNetCore.App contenait les sous-composants suivants :
- Json.NET (
Newtonsoft.Json) - Entity Framework Core (assemblys avec le préfixe
Microsoft.EntityFrameworkCore.) - Roslyn (
Microsoft.CodeAnalysis)
Nouveau comportement
Une référence à Microsoft.AspNetCore.App ne nécessite plus d’élément <PackageReference> dans le fichier projet. Le Kit de développement logiciel (SDK) .NET Core prend en charge un nouvel élément appelé <FrameworkReference>, qui remplace l’utilisation de <PackageReference>.
Pour plus d’informations, consultez dotnet/aspnetcore#3612.
Entity Framework Core expédié comme des packages NuGet. Ce changement aligne le modèle d’expédition sur toutes les autres bibliothèques d’accès aux données sur .NET. Il fournit à Entity Framework Core le chemin d’accès le plus simple pour continuer à innover tout en prenant en charge les différentes plateformes .NET. Le déplacement d’Entity Framework Core hors de l’infrastructure partagée n’a aucun impact sur son état en tant que bibliothèque développée, prise en charge et utilisable par Microsoft. La stratégie de support de .NET Core continue de le couvrir.
Json.NET et Entity Framework Core continuent de fonctionner avec ASP.NET Core. Toutefois, ils ne seront pas inclus dans l’infrastructure partagée.
Pour plus d’informations, consultez L’avenir de JSON dans .NET Core 3.0. Consultez également la liste complète des composants binaires supprimés de l’infrastructure partagée.
Raison de la modification
Ce changement simplifie la consommation de Microsoft.AspNetCore.App et réduit la duplication entre les packages NuGet et les infrastructures partagées.
Pour plus d’informations sur la motivation de ce changement, consultez ce billet de blog.
Action recommandée
À compter de ASP.NET Core 3.0, il n’est plus nécessaire que les projets consomment des assemblys dans Microsoft.AspNetCore.App en tant que packages NuGet. Pour simplifier le ciblage et l’utilisation de l’infrastructure partagée ASP.NET Core, de nombreux packages NuGet livrés depuis ASP.NET Core 1.0 ne sont plus produits. Les API que ces packages fournissent sont toujours disponibles pour les applications à l’aide d’un <FrameworkReference> pour Microsoft.AspNetCore.App. Les exemples d’API courants incluent Kestrel, MVC et Razor.
Ce changement ne s’applique pas à tous les composants binaires référencés via Microsoft.AspNetCore.App dans ASP.NET Core 2.x. Les exceptions notables sont les suivantes :
- Les bibliothèques
Microsoft.Extensionsqui continuent de cibler .NET Standard sont disponibles en tant que packages NuGet (consultez https://github.com/dotnet/extensions). - Les API produites par l’équipe ASP.NET Core qui ne font pas partie de
Microsoft.AspNetCore.App. Par exemple, les composants suivants sont disponibles en tant que packages NuGet :- Entity Framework Core (infrastructure d'entité de base)
- Les API qui fournissent une intégration tierce
- Fonctionnalités expérimentales
- Les API avec des dépendances qui n’ont pas pu répondre aux exigences pour être dans l’infrastructure partagée
- Extensions de MVC qui gèrent le support de Json.NET. Une API est fournie en tant que package NuGet pour prendre en charge l’utilisation de Json.NET et MVC. Consultez le guide de migration ASP.NET Core pour plus d’informations.
- Le client SignalR .NET continue de prendre en charge .NET Standard et est fourni en tant que package NuGet. Il est destiné à être utilisé sur de nombreux runtimes .NET, tels que Xamarin et UWP.
Pour plus d’informations, consultez Arrêter la production de packages pour les assemblys d’infrastructures partagées dans la version 3.0. Pour plus d’informations, consultez dotnet/aspnetcore#3757.
Catégorie
ASP.NET Core
API affectées
Infrastructure partagée : Microsoft.AspNetCore.All supprimé
À compter de ASP.NET Core 3.0, le métapaquet Microsoft.AspNetCore.All et l’infrastructure partagée Microsoft.AspNetCore.All correspondante ne sont plus produits. Ce package est disponible dans ASP.NET Core 2.2 et continuera de recevoir des mises à jour de maintenance dans ASP.NET Core 2.1.
Version introduite
3.0
Ancien comportement
Les applications peuvent utiliser le métapaquet Microsoft.AspNetCore.All pour cibler l’infrastructure partagée Microsoft.AspNetCore.All sur .NET Core.
Nouveau comportement
.NET Core 3.0 n’inclut pas d’infrastructure partagée Microsoft.AspNetCore.All.
Raison de la modification
Le métapaquet Microsoft.AspNetCore.All comprenait un grand nombre de dépendances externes.
Action recommandée
Migrez votre projet pour utiliser l’infrastructure Microsoft.AspNetCore.App. Les composants qui étaient précédemment disponibles dans Microsoft.AspNetCore.All sont toujours disponibles sur NuGet. Ces composants sont désormais déployés avec votre application au lieu d’être inclus dans l’infrastructure partagée.
Catégorie
ASP.NET Core
API affectées
Aucun
SignalR : HandshakeProtocol.SuccessHandshakeData remplacé
Le champ HandshakeProtocol.SuccessHandshakeData a été supprimé et remplacé par une méthode d’assistance qui génère une réponse de négociation réussie en fonction d’un IHubProtocolspécifique.
Version introduite
3.0
Ancien comportement
HandshakeProtocol.SuccessHandshakeData était un champ public static ReadOnlyMemory<byte>.
Nouveau comportement
HandshakeProtocol.SuccessHandshakeData a été remplacé par une méthode staticGetSuccessfulHandshake(IHubProtocol protocol) qui retourne un ReadOnlyMemory<byte> basé sur le protocole spécifié.
Raison de la modification
Des champs supplémentaires ont été ajoutés à la réponse d’établissement d'une liaison. Ils ne sont pas constants et changent en fonction du protocole sélectionné.
Action recommandée
Aucun. Ce type n’est pas conçu pour être utilisé à partir du code utilisateur. Il s’agit de public et il peut donc être partagé entre le serveur SignalR et le client. Il peut également être utilisé par les clients SignalR du client écrits dans .NET. Les utilisateurs de SignalR ne devraient pas être affectés par ce changement.
Catégorie
ASP.NET Core
API affectées
HandshakeProtocol.SuccessHandshakeData
SignalR : méthodes HubConnection ResetSendPing et ResetTimeout supprimées
Les méthodes ResetSendPing et ResetTimeout ont été supprimées de l’API HubConnection SignalR. Ces méthodes étaient initialement destinées uniquement à un usage interne, mais ont été rendues publiques dans ASP.NET Core 2.2. Ces méthodes ne seront pas disponibles à partir de la version ASP.NET Core 3.0 Préversion 4. Pour plus d’informations, consultez dotnet/aspnetcore#8543.
Version introduite
3.0
Ancien comportement
Les API étaient disponibles.
Nouveau comportement
Les API sont supprimées.
Raison de la modification
Ces méthodes étaient initialement destinées uniquement à un usage interne, mais ont été rendues publiques dans ASP.NET Core 2.2.
Action recommandée
N’utilisez pas ces méthodes.
Catégorie
ASP.NET Core
API affectées
SignalR : constructeurs HubConnectionContext modifiés
Les constructeurs HubConnectionContext de SignalR ont été changés pour accepter un type d’options, plutôt que plusieurs paramètres, en options d’ajout à l’épreuve du temps. Ce changement remplace deux constructeurs par un seul constructeur qui accepte un type d’options.
Version introduite
3.0
Ancien comportement
HubConnectionContext a deux constructeurs :
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory);
public HubConnectionContext(ConnectionContext connectionContext, TimeSpan keepAliveInterval, ILoggerFactory loggerFactory, TimeSpan clientTimeoutInterval);
Nouveau comportement
Les deux constructeurs ont été supprimés et remplacés par un seul constructeur :
public HubConnectionContext(ConnectionContext connectionContext, HubConnectionContextOptions contextOptions, ILoggerFactory loggerFactory)
Raison de la modification
Le nouveau constructeur utilise un nouvel objet d’options. Par conséquent, les fonctionnalités de HubConnectionContext peuvent être développées à l’avenir sans apporter plus de constructeurs ni de changements cassants.
Action recommandée
Au lieu d’utiliser le constructeur suivant :
HubConnectionContext connectionContext = new HubConnectionContext(
connectionContext,
keepAliveInterval: TimeSpan.FromSeconds(15),
loggerFactory,
clientTimeoutInterval: TimeSpan.FromSeconds(15));
Utilisez le constructeur suivant :
HubConnectionContextOptions contextOptions = new HubConnectionContextOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(15),
ClientTimeoutInterval = TimeSpan.FromSeconds(15)
};
HubConnectionContext connectionContext = new HubConnectionContext(connectionContext, contextOptions, loggerFactory);
Catégorie
ASP.NET Core
API affectées
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory)
- HubConnectionContext(ConnectionContext, TimeSpan, ILoggerFactory, TimeSpan)
SignalR : changement du nom du package client JavaScript
Dans ASP.NET Core 3.0 Préversion 7, le nom du package client JavaScript SignalR est passé de @aspnet/signalr à @microsoft/signalr. Le changement de nom reflète le fait que l’utilité de SignalR est plus large que pour les applications ASP.NET Core seules, grâce à Azure SignalR Service.
Pour réagir à ce changement, modifiez les références dans vos fichiers package.json, instructions require et instructions import ECMAScript. Aucune API ne sera modifiée dans le cadre de ce renommage.
Pour plus d’informations, consultez dotnet/aspnetcore#11637.
Version introduite
3.0
Ancien comportement
Le package client a été nommé @aspnet/signalr.
Nouveau comportement
Le package client est nommé @microsoft/signalr.
Raison de la modification
Le changement de nom précise que SignalR est utile au-delà des applications ASP.NET Core, grâce à Azure SignalR Service.
Action recommandée
Basculez vers le nouveau package @microsoft/signalr.
Catégorie
ASP.NET Core
API affectées
Aucun
SignalR : méthodes UseSignalR et UseConnections marquées comme obsolètes
Les méthodes UseConnections et UseSignalR et les classes ConnectionsRouteBuilder et HubRouteBuilder sont marquées comme obsolètes dans ASP.NET Core 3.0.
Version introduite
3.0
Ancien comportement
Le routage du hub SignalR a été configuré à l’aide de UseSignalR ou UseConnections.
Nouveau comportement
L’ancienne méthode de configuration du routage a été obsolète et remplacée par le routage de point de terminaison.
Raison de la modification
L’intergiciel est déplacé vers le nouveau système de routage du point de terminaison. L’ancienne méthode d’ajout d’intergiciels est devenue obsolète.
Action recommandée
Remplacez UseSignalR par UseEndpoints :
Ancien code :
app.UseSignalR(routes =>
{
routes.MapHub<SomeHub>("/path");
});
Nouveau code :
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<SomeHub>("/path");
});
Catégorie
ASP.NET Core
API affectées
- Microsoft.AspNetCore.Builder.ConnectionsAppBuilderExtensions.UseConnections(IApplicationBuilder, Action<ConnectionsRouteBuilder>)
- Microsoft.AspNetCore.Builder.SignalRAppBuilderExtensions.UseSignalR(IApplicationBuilder, Action<HubRouteBuilder>)
- Microsoft.AspNetCore.Http.Connections.ConnectionsRouteBuilder
- Microsoft.AspNetCore.SignalR.HubRouteBuilder
SPA : SpaServices et NodeServices marqués comme obsolètes
Le contenu des packages NuGet suivants n’a pas été nécessaire depuis ASP.NET Core 2.1. Par conséquent, les packages suivants sont marqués comme obsolètes :
Pour la même raison, les modules npm suivants sont marqués comme déconseillés :
Les packages précédents et les modules npm seront supprimés ultérieurement dans .NET 5.
Version introduite
3.0
Ancien comportement
Les packages déconseillés et les modules npm étaient destinés à intégrer ASP.NET Core à différentes infrastructures d’applications monopages (SPA). Ces infrastructures incluent Angular, React et React avec Redux.
Nouveau comportement
Un nouveau mécanisme d’intégration existe dans le package NuGet Microsoft.AspNetCore.SpaServices.Extensions. Le package reste la base des modèles de projet Angular et React depuis ASP.NET Core 2.1.
Raison de la modification
ASP.NET Core prend en charge l’intégration à différentes infrastructures d’applications monopages (SPA), notamment Angular, React et React avec Redux. Au départ, l’intégration à ces infrastructures a été effectuée avec des composants spécifiques à ASP.NET Core qui géraient des scénarios tels que le prérendu côté serveur et l’intégration à Webpack. Au fil du temps, les normes de l’industrie ont changé. Chacune des infrastructures SPA a publié ses propres interfaces de ligne de commande standard. Par exemple, Angular CLI et create-react-app.
Lorsque ASP.NET Core 2.1 a été publié en mai 2018, l’équipe a réagi au changement de normes. Un moyen plus récent et plus simple d’intégrer les propres chaînes d’outils des infrastructures SPA a été fourni. Le nouveau mécanisme d’intégration existe dans le package Microsoft.AspNetCore.SpaServices.Extensions et reste la base des modèles de projet Angular et React depuis ASP.NET Core 2.1.
Pour clarifier que les anciens composants spécifiques aux ASP.NET Core sont non pertinents et non recommandés :
- Le mécanisme d’intégration antérieur à la version 2.1 est marqué comme obsolète.
- Les packages npm de support sont marqués comme déconseillés.
Action recommandée
Si vous utilisez ces packages, mettez à jour vos applications pour utiliser les fonctionnalités suivantes :
- Dans le package
Microsoft.AspNetCore.SpaServices.Extensions. - Fournis par les infrastructures SPA que vous utilisez
Pour activer des fonctionnalités telles que le prérendu côté serveur et le rechargement de module à chaud, consultez la documentation de l’infrastructure SPA correspondante. La fonctionnalité dans Microsoft.AspNetCore.SpaServices.Extensionsn’est pas obsolète et continuera d’être prise en charge.
Catégorie
ASP.NET Core
API affectées
Microsoft.AspNetCore.NodeServices.HostingModels.INodeInstance
Microsoft.AspNetCore.NodeServices.HostingModels.NodeInvocationException
Microsoft.AspNetCore.NodeServices.HostingModels.NodeInvocationInfo
Microsoft.AspNetCore.NodeServices.HostingModels.NodeServicesOptionsExtensions
Microsoft.AspNetCore.NodeServices.HostingModels.OutOfProcessNodeInstance
Microsoft.AspNetCore.SpaServices.Prerendering.ISpaPrerenderer
Microsoft.AspNetCore.SpaServices.Prerendering.ISpaPrerendererBuilder
Microsoft.AspNetCore.SpaServices.Prerendering.JavaScriptModuleExport
Microsoft.AspNetCore.SpaServices.Prerendering.PrerenderTagHelper
Microsoft.AspNetCore.SpaServices.Prerendering.RenderToStringResult
Microsoft.AspNetCore.SpaServices.Webpack.WebpackDevMiddlewareOptions
Microsoft.Extensions.DependencyInjection.NodeServicesServiceCollectionExtensions
Microsoft.Extensions.DependencyInjection.PrerenderingServiceCollectionExtensions
SPA : SpaServices et NodeServices ne reviennent plus à l’enregistreur d’événements de la console
Microsoft.AspNetCore.SpaServices et Microsoft.AspNetCore.NodeServices n’affichent pas les journaux de console, sauf si la journalisation est configurée.
Version introduite
3.0
Ancien comportement
Microsoft.AspNetCore.SpaServices et Microsoft.AspNetCore.NodeServices sont utilisés pour créer automatiquement un enregistreur d’événements de console lorsque la journalisation n’est pas configurée.
Nouveau comportement
Microsoft.AspNetCore.SpaServices et Microsoft.AspNetCore.NodeServices n’affichent pas les journaux de console, sauf si la journalisation est configurée.
Raison de la modification
Il est nécessaire de s’aligner sur la façon dont les autres packages ASP.NET Core implémentent la journalisation.
Action recommandée
Si l’ancien comportement est requis, pour configurer la journalisation de la console, ajoutez services.AddLogging(builder => builder.AddConsole()) à votre méthode Setup.ConfigureServices.
Catégorie
ASP.NET Core
API affectées
Aucun
Version cible de .Net Framework : le support .NET Framework a été annulé
À compter de ASP.NET Core 3.0, .NET Framework est une version cible de .Net Framework non prise en charge.
Description de la modification
.NET Framework 4.8 est la dernière version principale de .NET Framework. Les nouvelles applications ASP.NET Core doivent être basées sur .NET Core. À compter de la version de .NET Core 3.0, vous pouvez considérer ASP.NET Core 3.0 comme faisant partie de .NET Core.
Les clients qui utilisent ASP.NET Core avec .NET Framework peuvent continuer de manière entièrement prise en charge à l’aide de la version 2.1 LTS. Le support et la maintenance de la version 2.1 se poursuivent jusqu’au 21 août 2021 au moins. Il s’agit de trois ans après la déclaration de la version LTS conformément à la stratégie de support .NET. Le support des packages ASP.NET Core 2.1 sur .NET Framework s’étendra indéfiniment, comme la stratégie de maintenance des autres infrastructures de ASP.NET basées sur des packages.
Pour plus d’informations sur le déplacement de .NET Framework vers .NET Core, consultez Déplacement vers .NET Core.
Les packages Microsoft.Extensions (tels que la journalisation, l’injection de dépendances et la configuration) et Entity Framework Core ne sont pas affectés. Ils continueront à prendre en charge .NET Standard.
Pour plus d’informations sur la motivation de ce changement, consultez le billet de blog d’origine.
Version introduite
3.0
Ancien comportement
Les applications ASP.NET Core peuvent s’exécuter sur .NET Core ou .NET Framework.
Nouveau comportement
Les applications ASP.NET Core ne peuvent s’exécuter que sur .NET Core.
Action recommandée
Effectuez l'une des opérations suivantes :
- Conservez votre application sur ASP.NET Core 2.1.
- Migrez votre application et vos dépendances vers .NET Core.
Catégorie
ASP.NET Core
API affectées
Aucun
Bibliothèques .NET Core
- Les API qui indiquent la version indiquent désormais le produit et non la version du fichier.
- Les instances EncoderFallbackBuffer personnalisées ne peuvent pas revenir en arrière de manière récursive
- Mise en forme de type virgule flottante et analyse des changements de comportement
- Les opérations d’analyse de type virgule flottante n’échouent plus ou lèvent une OverflowException
- InvalidAsynchronousStateException déplacé vers un autre assembly
- Le remplacement de séquences d’octets UTF-8 mal formées suit les instructions Unicode
- TypeDescriptionProviderAttribute déplacé vers un autre assembly
- ZipArchiveEntry ne gère plus les archives avec des tailles d’entrée incohérentes
- FieldInfo.SetValue lève une exception pour les champs statiques et init uniquement
- Le passage de GroupCollection à des méthodes d’extension prenant IEnumerable<T> nécessite de lever l’ambiguïté
Les API qui indiquent la version indiquent désormais le produit et non la version du fichier.
La plupart des API qui retournent des versions dans .NET Core retournent désormais la version du produit plutôt que la version du fichier.
Description de la modification
Dans .NET Core 2.2 et versions antérieures, les méthodes, telles que Environment.Version et RuntimeInformation.FrameworkDescription, et la boîte de dialogue des propriétés de fichier pour les assemblys .NET Core reflètent la version de fichier. À compter de .NET Core 3.0, elles reflètent la version du produit.
La figure suivante illustre la différence entre les informations de version pour l’assembly System.Runtime.dll de .NET Core 2.2 (à gauche) et de .NET Core 3.0 (à droite), comme indiqué dans la boîte de dialogue des propriétés du fichier dans l’Explorateur Windows.

Version introduite
3.0
Action recommandée
Aucun. Ce changement devrait simplifier la détection des versions et la rendre plus intuitive.
Catégorie
Bibliothèques .NET Core
API affectées
Les instances EncoderFallbackBuffer personnalisées ne peuvent pas revenir en arrière de manière récursive
Les instances EncoderFallbackBuffer personnalisées ne peuvent pas revenir en arrière de manière récursive. L’implémentation de EncoderFallbackBuffer.GetNextChar() doit entraîner une séquence de caractères convertible en encodage de destination. Autrement, une exception se produit.
Description de la modification
Pendant une opération de transcodage de caractère à octet, le runtime détecte les séquences UTF-16 mal formées ou non convertibles et fournit ces caractères à la méthode EncoderFallbackBuffer.Fallback. La méthode Fallback détermine quels caractères doivent être substitués aux données non modifiables d’origine, et ces caractères sont vidés en appelant EncoderFallbackBuffer.GetNextChar dans une boucle.
Le runtime tente ensuite de transcoder ces caractères de substitution vers l’encodage cible. Si cette opération réussit, le runtime continue le transcodage à partir de l’endroit où il s’est arrêté dans la chaîne d’entrée d’origine.
Auparavant, les implémentations personnalisées de EncoderFallbackBuffer.GetNextChar() peuvent retourner des séquences de caractères qui ne sont pas convertibles en l’encodage de destination. Si les caractères substitués ne peuvent pas être transcodés en l’encodage cible, le runtime appelle de nouveau la méthode EncoderFallbackBuffer.Fallback avec les caractères de substitution, en attendant que la méthode EncoderFallbackBuffer.GetNextChar() retourne une nouvelle séquence de substitution. Ce processus se poursuit jusqu’à ce que le runtime rencontre éventuellement une substitution bien formée, convertible ou jusqu’à ce qu’un nombre maximal de récursions soit atteint.
À compter de .NET Core 3.0, les implémentations personnalisées de EncoderFallbackBuffer.GetNextChar() doivent retourner des séquences de caractères convertibles en l’encodage de destination. Si les caractères substitués ne peuvent pas être transcodés vers l’encodage cible, une exception ArgumentException est levée. Le runtime n’effectue plus d’appels récursifs dans l’instance EncoderFallbackBuffer.
Ce comportement s’applique uniquement lorsque les trois conditions suivantes sont remplies :
- Le runtime détecte une séquence UTF-16 mal formée ou une séquence UTF-16 qui ne peut pas être convertie en encodage cible.
- Un EncoderFallback a été spécifié.
- La commande personnalisée EncoderFallback tente de remplacer une nouvelle séquence UTF-16 mal formée ou non convertible.
Version introduite
3.0
Action recommandée
La plupart des développeurs n’ont pas besoin de prendre de mesures.
Si une application utilise une classe EncoderFallback et EncoderFallbackBuffer personnalisée, assurez-vous que l’implémentation de EncoderFallbackBuffer.Fallback remplit la mémoire tampon de secours avec des données UTF-16 bien formées qui sont directement convertibles en encodage cible lorsque la méthode Fallback est appelée pour la première fois par le runtime.
Catégorie
Bibliothèques .NET Core
API affectées
Comportement de mise en forme et d’analyse de type virgule flottante modifié
Le comportement d’analyse et de mise en forme à virgule flottante (par les types Double et Single) est désormais conforme à l’IEEE. Cela garantit que le comportement des types virgule flottante dans .NET correspond à celui d’autres langages conformes à l’IEEE. Par exemple, double.Parse("SomeLiteral") doit toujours correspondre à ce que C# produit pour double x = SomeLiteral.
Description de la modification
Dans .NET Core 2.2 et versions antérieures, la mise en forme avec Double.ToString et Single.ToString, et l’analyse avec Double.Parse, Double.TryParse, Single.Parse et Single.TryParse ne sont pas conformes à l’IEEE. Par conséquent, il est impossible de garantir qu’une valeur effectue un aller-retour avec n’importe quelle chaîne de format standard ou personnalisée prise en charge. Pour certaines entrées, la tentative d’analyse d’une valeur formatée peut échouer et, pour d’autres, la valeur analysée n’est pas égale à la valeur d’origine.
À compter de .NET Core 3.0, les opérations d’analyse et de mise en forme de type virgule flottante sont conformes à l’IEEE 754.
Le tableau suivant présente deux extraits de code et la façon dont la sortie change entre .NET Core 2.2 et .NET Core 3.1.
| Extrait de code | Sortie sur .NET Core 2.2 | Sortie sur .NET Core 3.1 |
|---|---|---|
Console.WriteLine((-0.0).ToString()); |
0 | -0 |
var value = -3.123456789123456789;Console.WriteLine(value == double.Parse(value.ToString())); |
False |
True |
Pour plus d’informations, consultez le billet de blog Floating-point parsing and formatting improvements in .NET Core 3.0.
Version introduite
3.0
Action recommandée
La section Potential impact to existing code du billet de blog Floating-point parsing and formatting improvements in .NET Core 3.0 suggère les modifications que vous pouvez apporter à votre code si vous souhaitez maintenir le comportement précédent.
- Pour certaines différences de mise en forme, vous pouvez obtenir un comportement équivalent au comportement précédent en spécifiant une chaîne de format différente.
- Pour les différences d’analyse, il n’existe aucun mécanisme pour revenir au comportement précédent.
Catégorie
Bibliothèques .NET Core
API affectées
Les opérations d’analyse de type virgule flottante n’échouent plus ou lèvent une OverflowException
Les méthodes d’analyse à virgule flottante ne lèvent plus d’exception OverflowException et ne retournent plus false lorsqu’elles analysent une chaîne dont la valeur numérique est en dehors de la plage du type à virgule flottante Single ou Double.
Description de la modification
Dans .NET Core 2.2 et versions antérieures, les méthodes Double.Parse et Single.Parse lèvent une exception OverflowException pour les valeurs en dehors de la plage pour leur type respectif. Les méthodes Double.TryParse et Single.TryParse retournent false pour les représentations chaîne des valeurs numériques hors plage.
À compter de .NET Core 3.0, les méthodes Double.Parse, Double.TryParse, Single.Parse et Single.TryParse n’échouent plus lors de l’analyse des chaînes numériques hors limites. Au lieu de cela, les méthodes d’analyse Double retournent Double.PositiveInfinity pour les valeurs supérieures à Double.MaxValue, et Double.NegativeInfinity pour les valeurs inférieures à Double.MinValue. De même, les méthodes d’analyse Single retournent Single.PositiveInfinity pour les valeurs supérieures à Single.MaxValue, et Single.NegativeInfinity pour les valeurs inférieures à Single.MinValue.
Ce changement a été apporté pour améliorer la conformité à l’IEEE 754:2008.
Version introduite
3.0
Action recommandée
Ce changement peut affecter votre code de deux façons :
Votre code dépend du gestionnaire de l’exception OverflowException à exécuter lors d’un dépassement. Dans ce cas, vous devez supprimer l’instruction
catchet placer tout code nécessaire dans une instructionIfqui vérifie si Double.IsInfinity ou Single.IsInfinity est égal àtrue.Votre code suppose que les valeurs à virgule flottante sont différentes de
Infinity. Dans ce cas, vous devez ajouter le code nécessaire pour vérifier les valeurs à virgule flottantePositiveInfinityetNegativeInfinity.
Catégorie
Bibliothèques .NET Core
API affectées
InvalidAsynchronousStateException déplacé vers un autre assembly
La classe InvalidAsynchronousStateException a été déplacée.
Description de la modification
Dans .NET Core 2.2 et versions antérieures, la classe InvalidAsynchronousStateException réside dans l’assembly System.ComponentModel.TypeConverter.
À compter de .NET Core 3.0, elle réside dans l’assembly System.ComponentModel.Primitives.
Version introduite
3.0
Action recommandée
Cette modification affecte uniquement les applications qui utilisent la réflexion pour charger le InvalidAsynchronousStateException en appelant une méthode telle que Assembly.GetType ou une surcharge de Activator.CreateInstance qui suppose que le type se trouve dans un assembly particulier. Si c’est le cas, mettez à jour l’assembly référencé dans l’appel de méthode pour refléter le nouvel emplacement d’assembly du type.
Catégorie
Bibliothèques .NET Core
API affectées
Aucun.
Le remplacement de séquences d’octets UTF-8 mal formées suit les instructions Unicode
Quand la classe UTF8Encoding rencontre une séquence d’octets UTF-8 incorrecte lors d’une opération de transcodage d’un octet à un caractère, elle remplace cette séquence par un caractère de remplacement « � » (caractère de remplacement U + FFFD) dans la chaîne de sortie. .NET Core 3.0 diffère des versions précédentes de .NET Core et de .NET Framework en suivant les meilleures pratiques Unicode pour effectuer ce remplacement pendant l’opération de transcodage.
Cela fait partie d’un effort plus large pour améliorer la gestion UTF-8 dans .NET, notamment par les nouveaux types System.Text.Unicode.Utf8 et System.Text.Rune. Le type UTF8Encoding a reçu des mécanismes de gestion des erreurs améliorés afin qu’il produise une sortie cohérente avec les types nouvellement introduits.
Description de la modification
À compter de .NET Core 3.0, lors du transcodage en caractères, la classe UTF8Encoding effectue une substitution de caractères en fonction des meilleures pratiques Unicode. Le mécanisme de substitution utilisé est décrit dans le document en anglais The Unicode Standard, Version 12.0, Sec. 3.9 (PDF), section U+FFFD Substitution of Maximal Subparts.
Ce comportement s’applique uniquement lorsque la séquence d’octets d’entrée contient des données UTF-8 mal formées. En outre, si l’instance UTF8Encoding a été construite avec throwOnInvalidBytes: true, UTF8Encoding continue de lever sur une entrée non valide plutôt que d’effectuer un remplacement U+FFFD. Pour plus d’informations sur le constructeur UTF8Encoding, consultez UTF8Encoding(Boolean, Boolean).
Le tableau suivant illustre l’impact de ce changement avec une entrée de 3 octets non valide :
| Entrée de 3 octets mal formée | Sortie avant .NET Core 3.0 | Sortie commençant pas .NET Core 3.0 |
|---|---|---|
[ ED A0 90 ] |
[ FFFD FFFD ] (sortie à 2 caractères) |
[ FFFD FFFD FFFD ] (sortie à 3 caractères) |
La sortie à 3 caractères est la sortie préférée, selon le tableau 3-9 du PDF de la norme Unicode précédemment cité.
Version introduite
3.0
Action recommandée
Aucune action n’est requise de la part du développeur.
Catégorie
Bibliothèques .NET Core
API affectées
TypeDescriptionProviderAttribute déplacé vers un autre assembly
La classe TypeDescriptionProviderAttribute a été déplacée.
Description de la modification
Dans .NET Core 2.2 et versions antérieures, la classe TypeDescriptionProviderAttribute réside dans l’assembly System.ComponentModel.TypeConverter.
À compter de .NET Core 3.0, elle réside dans l’assembly System.ObjectModel.
Version introduite
3.0
Action recommandée
Ce changement affecte uniquement les applications qui utilisent la réflexion pour charger le type TypeDescriptionProviderAttribute en appelant une méthode telle que Assembly.GetType ou une surcharge de Activator.CreateInstance qui suppose que le type se trouve dans un assembly particulier. Si c’est le cas, l’assembly référencé dans l’appel de méthode doit être mis à jour pour refléter le nouvel emplacement d’assembly du type.
Catégorie
Windows Forms
API affectées
Aucun.
ZipArchiveEntry ne gère plus les archives avec des tailles d’entrée incohérentes
Les archives zip indiquent à la fois la taille compressée et la taille non compressée des données dans le répertoire central et l’en-tête local. Les données d’entrée elles-mêmes indiquent également leur taille. Dans .NET Core 2.2 et versions antérieures, ces valeurs n’ont jamais été vérifiées par souci de cohérence. À partir de .NET Core 3.0, elles le sont.
Description de la modification
Dans .NET Core 2.2 et versions antérieures, ZipArchiveEntry.Open() réussit même si l’en-tête local n’est pas en accord avec l’en-tête central du fichier zip. Les données sont compressées jusqu’à ce que la fin du flux compressé soit atteinte même si sa longueur dépasse la taille de fichier non compressée répertoriée dans le répertoire central/en-tête local.
À compter de .NET Core 3.0, la méthode ZipArchiveEntry.Open() vérifie que l’en-tête local et l’en-tête central s’accordent sur les tailles compressée et non compressée d’une entrée. Si ce n’est pas le cas, la méthode lève un InvalidDataException si l’en-tête local de l’archive et/ou les tailles de liste de descripteur de données ne correspondent pas au répertoire central du fichier zip. Lors de la lecture d’une entrée, les données décompressées sont tronquées à la taille de fichier non compressée répertoriée dans l’en-tête.
Cette modification a été apportée pour s’assurer qu’un ZipArchiveEntry représente correctement la taille de ses données et que seule cette quantité de données est lue.
Version introduite
3.0
Action recommandée
Repackagez toute archive zip qui présente ces problèmes.
Catégorie
Bibliothèques .NET Core
API affectées
- ZipArchiveEntry.Open()
- ZipFileExtensions.ExtractToDirectory
- ZipFileExtensions.ExtractToFile
- ZipFile.ExtractToDirectory
FieldInfo.SetValue lève une exception pour les champs statiques et init uniquement
À compter de .NET Core 3.0, une exception est levée lorsque vous tentez de définir une valeur sur un champ statique InitOnly en appelant System.Reflection.FieldInfo.SetValue.
Description de la modification
Dans .NET Framework et les versions de .NET Core antérieures à la version 3.0, vous pouvez définir la valeur d’un champ statique qui est constante après son initialisation (en lecture seule en C#) en appelant System.Reflection.FieldInfo.SetValue. Cependant, le fait de définir un tel champ de cette manière a entraîné un comportement imprévisible basé sur l’infrastructure cible et les paramètres d’optimisation.
Dans .NET Core 3.0 et versions ultérieures, lorsque vous appelez SetValue sur un champ statique, InitOnly, une exception System.FieldAccessException est levée.
Conseil
Un champ InitOnly est un champ qui ne peut être défini qu’au moment où il est déclaré ou dans le constructeur pour la classe conteneur. En d’autres termes, il est constant après son initialisation.
Version introduite
3.0
Action recommandée
Initialisez des champs InitOnly statiques dans un constructeur statique. Cela s’applique aux types dynamiques et non dynamiques.
Vous pouvez également supprimer l’attribut FieldAttributes.InitOnly du champ, puis appeler FieldInfo.SetValue.
Catégorie
Bibliothèques .NET Core
API affectées
- FieldInfo.SetValue(Object, Object)
- FieldInfo.SetValue(Object, Object, BindingFlags, Binder, CultureInfo)
Le passage de GroupCollection à des méthodes d’extension prenant IEnumerable<T> nécessite de lever l’ambiguïté
Lors de l’appel d’une méthode d’extension qui prend un IEnumerable<T> sur un GroupCollection, vous devez lever l’ambiguïté du type à l’aide d’un cast.
Description de la modification
À compter de .NET Core 3.0, System.Text.RegularExpressions.GroupCollection implémente IEnumerable<KeyValuePair<String,Group>> en plus des autres types, notamment IEnumerable<Group>. Cela entraîne une ambiguïté lors de l’appel d’une méthode d’extension qui prend un IEnumerable<T>. Si vous appelez une telle méthode d’extension sur une instance GroupCollection, par exemple Enumerable.Count, l’erreur du compilateur suivante s’affichera :
CS1061 : « GroupCollection » ne contient pas de définition pour « Count » et aucune méthode d’extension accessible « Count » acceptant un premier argument de type « GroupCollection » n’a été trouvée (une directive using ou une référence d’assembly est-elle manquante ?)
Dans les versions précédentes de .NET, il n’y avait aucune ambiguïté et aucune erreur du compilateur.
Version introduite
3.0
Raison de la modification
Il s’agissait d’un changement cassant involontaire. Comme c’est le cas depuis un certain temps, nous n’avons pas l’intention de le rétablir. En outre, un tel changement serait lui-même cassant.
Action recommandée
Pour les instances GroupCollection, vous pouvez lever l’ambiguïté des appels aux méthodes d’extension qui acceptent un IEnumerable<T> avec un cast.
// Without a cast - causes CS1061.
match.Groups.Count(_ => true)
// With a disambiguating cast.
((IEnumerable<Group>)m.Groups).Count(_ => true);
Catégorie
Bibliothèques .NET Core
API affectées
Toute méthode d’extension qui accepte un élément IEnumerable<T> est affectée. Par exemple :
- System.Collections.Immutable.ImmutableArray.ToImmutableArray<TSource>(IEnumerable<TSource>)
- System.Collections.Immutable.ImmutableDictionary.ToImmutableDictionary
- System.Collections.Immutable.ImmutableHashSet.ToImmutableHashSet
- System.Collections.Immutable.ImmutableList.ToImmutableList<TSource>(IEnumerable<TSource>)
- System.Collections.Immutable.ImmutableSortedDictionary.ToImmutableSortedDictionary
- System.Collections.Immutable.ImmutableSortedSet.ToImmutableSortedSet
- System.Data.DataTableExtensions.CopyToDataTable
- La plupart des méthodes
System.Linq.Enumerable, par exemple, System.Linq.Enumerable.Count - System.Linq.ParallelEnumerable.AsParallel
- System.Linq.Queryable.AsQueryable
Chiffrement
- La syntaxe BEGIN TRUSTED CERTIFICATE n’est plus prise en charge sur Linux
- EnvelopedCms est défini par défaut sur le chiffrement AES-256
- La taille minimale pour la génération de clés RSAOpenSsl a augmenté
- .NET Core 3.0 préfère OpenSSL 1.1.x à OpenSSL 1.0.x
- CryptoStream.Dispose transforme le bloc final uniquement lors de l’écriture
La syntaxe « BEGIN TRUSTED CERTIFICATE » n’est plus prise en charge pour les certificats racines sur Linux
Les certificats racines sur Linux et les autres systèmes de type Unix (mais pas macOS) peuvent être présentés sous deux formes : l’en-tête PEM BEGIN CERTIFICATE standard et l’en-tête PEM BEGIN TRUSTED CERTIFICATE spécifique à OpenSSL. La dernière syntaxe permet d’utiliser une configuration supplémentaire qui a provoqué des problèmes de compatibilité avec la classe System.Security.Cryptography.X509Certificates.X509Chain de .NET Core. Le contenu du certificat racine BEGIN TRUSTED CERTIFICATE n’est plus chargé par le moteur de chaîne à partir de .NET Core 3.0.
Description de la modification
Auparavant, les syntaxes BEGIN TRUSTED CERTIFICATE et BEGIN CERTIFICATE étaient utilisées pour remplir la liste d’approbation racine. Si la syntaxe BEGIN TRUSTED CERTIFICATE a été utilisée et que des options supplémentaires ont été spécifiées dans le fichier, il est possible que X509Chain ait indiqué que l’approbation de chaîne a été explicitement interdite (X509ChainStatusFlags.ExplicitDistrust). Toutefois, si le certificat a également été spécifié avec la syntaxe BEGIN CERTIFICATE dans un fichier précédemment chargé, l’approbation de chaîne a été autorisée.
À compter de .NET Core 3.0, les contenus BEGIN TRUSTED CERTIFICATE ne sont plus lus. Si le certificat n’est pas également spécifié via une syntaxe BEGIN CERTIFICATE standard, la X509Chain indique que la racine n’est pas approuvée (X509ChainStatusFlags.UntrustedRoot).
Version introduite
3.0
Action recommandée
La plupart des applications ne sont pas affectées par ce changement, mais les applications qui ne peuvent pas voir les deux sources de certificat racine en raison de problèmes d’autorisations peuvent rencontrer des erreurs UntrustedRoot inattendues après la mise à niveau.
De nombreuses distributions Linux écrivent des certificats racines dans deux emplacements : un répertoire à un certificat par fichier et une concaténation à un fichier. Dans certaines distributions, le répertoire à un certificat par fichier utilise la syntaxe BEGIN TRUSTED CERTIFICATE tandis que la concaténation des fichiers utilise la syntaxe BEGIN CERTIFICATE standard. Vérifiez que tous les certificats racines personnalisés sont ajoutés comme BEGIN CERTIFICATE dans l’un de ces emplacements au minimum, et que les deux emplacements peuvent être lus par votre application.
Le répertoire classique est /etc/ssl/certs/ et le fichier concaténé classique est /etc/ssl/cert.pem. Utilisez la commande openssl version -d pour déterminer la racine spécifique à la plateforme, qui peut différer de /etc/ssl/. Par exemple, sur Ubuntu 18.04, le répertoire est /usr/lib/ssl/certs/ et le fichier est /usr/lib/ssl/cert.pem. Toutefois, /usr/lib/ssl/certs/ est un lien symbolique vers /etc/ssl/certs/ et /usr/lib/ssl/cert.pem n’existe pas.
$ openssl version -d
OPENSSLDIR: "/usr/lib/ssl"
$ ls -al /usr/lib/ssl
total 12
drwxr-xr-x 3 root root 4096 Dec 12 17:10 .
drwxr-xr-x 73 root root 4096 Feb 20 15:18 ..
lrwxrwxrwx 1 root root 14 Mar 27 2018 certs -> /etc/ssl/certs
drwxr-xr-x 2 root root 4096 Dec 12 17:10 misc
lrwxrwxrwx 1 root root 20 Nov 12 16:58 openssl.cnf -> /etc/ssl/openssl.cnf
lrwxrwxrwx 1 root root 16 Mar 27 2018 private -> /etc/ssl/private
Catégorie
Chiffrement
API affectées
EnvelopedCms est défini par défaut sur le chiffrement AES-256
L’algorithme de chiffrement symétrique par défaut utilisé par EnvelopedCms est passé de TripleDES à AES-256.
Description de la modification
Dans les versions précédentes, lorsque EnvelopedCms est utilisé pour chiffrer des données sans spécifier d’algorithme de chiffrement symétrique via une surcharge de constructeur, les données sont chiffrées avec l’algorithme TripleDES/3DES/3DEA/DES3-EDE.
À compter de .NET Core 3.0 (via la version 4.6.0 du package NuGet System.Security.Cryptography.Pkcs), l’algorithme par défaut a été remplacé par AES-256 pour la modernisation de l’algorithme et pour améliorer la sécurité des options par défaut. Si un certificat de destinataire de message a une clé publique Diffie-Hellman (non EC), l’opération de chiffrement peut échouer avec une CryptographicException en raison de limitations au niveau de la plateforme sous-jacente.
Dans l’exemple de code suivant, les données sont chiffrées avec TripleDES si elles s’exécutent sur .NET Core 2.2 ou une version antérieure. Si vous exécutez .NET Core 3.0 ou une version ultérieure, elles sont chiffrées avec AES-256.
EnvelopedCms cms = new EnvelopedCms(content);
cms.Encrypt(recipient);
return cms.Encode();
Version introduite
3.0
Action recommandée
Si ce changement vous impacte négativement, vous pouvez restaurer le chiffrement TripleDES en spécifiant explicitement l’identificateur de l’algorithme de chiffrement dans un constructeur EnvelopedCms qui inclut un paramètre de type AlgorithmIdentifier, par exemple :
Oid tripleDesOid = new Oid("1.2.840.113549.3.7", null);
AlgorithmIdentifier tripleDesIdentifier = new AlgorithmIdentifier(tripleDesOid);
EnvelopedCms cms = new EnvelopedCms(content, tripleDesIdentifier);
cms.Encrypt(recipient);
return cms.Encode();
Catégorie
Chiffrement
API affectées
La taille minimale pour la génération de clés RSAOpenSsl a augmenté
La taille minimale pour la génération de nouvelles clés RSA sur Linux est passée de 384 bits à 512 bits.
Description de la modification
À compter de .NET Core 3.0, la taille minimale de clé légale indiquée par la propriété LegalKeySizes sur les instances RSA de RSA.Create, RSAOpenSsl et RSACryptoServiceProvider sur Linux a augmenté de 384 à 512.
Par conséquent, dans .NET Core 2.2 et les versions antérieures, un appel de méthode tel que RSA.Create(384) aboutit. Dans .NET Core 3.0 et les versions ultérieures, l’appel de méthode RSA.Create(384) lève une exception indiquant que la taille est trop petite.
Ce changement a été apporté car OpenSSL, qui effectue les opérations de chiffrement sur Linux, a augmenté son minimum entre les versions 1.0.2 et 1.1.0. .NET Core 3.0 préfère OpenSSL 1.1.x à 1.0.x et la version signalée minimale a augmenté pour refléter cette nouvelle limitation de dépendance plus élevée.
Version introduite
3.0
Action recommandée
Si vous appelez l’une des API affectées, vérifiez que la taille des clés générées n’est pas inférieure au minimum du fournisseur.
Note
RSA 384 bits est déjà considéré comme non sécurisé (comme l’est RSA 512 bits). Les recommandations modernes, telles que la publication spéciale NIST 800-57 Partie 1 Révision 4, suggèrent d’utiliser la taille minimale 2048 bits pour les clés nouvellement générées.
Catégorie
Chiffrement
API affectées
.NET Core 3.0 préfère OpenSSL 1.1.x à OpenSSL 1.0.x
.NET Core pour Linux, qui fonctionne sur plusieurs distributions Linux, peut prendre en charge OpenSSL 1.0.x et OpenSSL 1.1.x. .NET Core 2.1 et .NET Core 2.2 recherchent d’abord 1.0.x, puis reviennent à 1.1.x ; .NET Core 3.0 recherche d’abord 1.1.x. Ce changement a été apporté pour ajouter le support des nouvelles normes de chiffrement.
Ce changement peut avoir un impact sur les bibliothèques ou applications qui assurent l’interopérabilité des plateformes avec les types d’interopérabilité spécifiques à OpenSSL dans .NET Core.
Description de la modification
Dans .NET Core 2.2 et les versions antérieures, le runtime préfère charger OpenSSL 1.0.x sur 1.1.x. Cela signifie que les types IntPtr et SafeHandle pour l’interopérabilité avec OpenSSL sont utilisés avec libcrypto.so.1.0.0 / libcrypto.so.1.0 / libcrypto.so.10 par préférence.
À compter de .NET Core 3.0, le runtime préfère charger OpenSSL 1.1.x sur OpenSSL 1.0.x, de sorte que les types IntPtr et SafeHandlepour l’interopérabilité avec OpenSSL sont utilisés avec libcrypto.so.1.1 / libcrypto.so.11 / libcrypto.so.1.1.0 / libcrypto.so.1.1.1 par préférence. Par conséquent, les bibliothèques et les applications qui interagissent directement avec OpenSSL peuvent avoir des pointeurs incompatibles avec les valeurs exposées à .NET Core lors de la mise à niveau à partir de .NET Core 2.1 ou .NET Core 2.2.
Version introduite
3.0
Action recommandée
Les bibliothèques et applications qui effectuent des opérations directes avec OpenSSL doivent veiller à s’assurer qu’elles utilisent la même version d’OpenSSL que le runtime .NET Core.
Toutes les bibliothèques ou applications qui utilisent les valeurs IntPtr ou SafeHandle des types de chiffrement .NET Core directement avec OpenSSL doivent comparer la version de la bibliothèque qu’elles utilisent avec la nouvelle propriété SafeEvpPKeyHandle.OpenSslVersion pour s’assurer que les pointeurs sont compatibles.
Catégorie
Chiffrement
API affectées
- SafeEvpPKeyHandle
- RSAOpenSsl(IntPtr)
- RSAOpenSsl(SafeEvpPKeyHandle)
- RSAOpenSsl.DuplicateKeyHandle()
- DSAOpenSsl(IntPtr)
- DSAOpenSsl(SafeEvpPKeyHandle)
- DSAOpenSsl.DuplicateKeyHandle()
- ECDsaOpenSsl(IntPtr)
- ECDsaOpenSsl(SafeEvpPKeyHandle)
- ECDsaOpenSsl.DuplicateKeyHandle()
- ECDiffieHellmanOpenSsl(IntPtr)
- ECDiffieHellmanOpenSsl(SafeEvpPKeyHandle)
- ECDiffieHellmanOpenSsl.DuplicateKeyHandle()
- X509Certificate.Handle
CryptoStream.Dispose transforme le bloc final uniquement lors de l’écriture
La méthode CryptoStream.Dispose, utilisée pour finaliser les opérations CryptoStream, ne tente plus de transformer le bloc final lors de la lecture.
Description de la modification
Dans les versions précédentes de .NET, si un utilisateur effectuait une lecture incomplète lors de l’utilisation de CryptoStream en mode Read, la méthode Dispose pouvait lever une exception (par exemple, lors de l’utilisation d’AES avec un remplissage). L’exception était levée car une tentative de transformation du bloc final survenait alors que les données étaient incomplètes.
Dans .NET Core 3.0 et les versions ultérieures, Dispose ne tente plus de transformer le bloc final lors de la lecture, ce qui permet des lectures incomplètes.
Raison de la modification
Ce changement permet des lectures incomplètes du flux de chiffrement lorsqu’une opération réseau est annulée, sans avoir besoin d’intercepter une exception.
Version introduite
3.0
Action recommandée
La plupart des applications ne doivent pas être affectées par ce changement.
Si votre application a précédemment intercepté une exception en cas de lecture incomplète, vous pouvez supprimer ce bloc catch.
Si votre application a utilisé la transformation du bloc final dans les scénarios de hachage, vous devrez peut-être vous assurer que l’ensemble du flux est lu avant sa suppression.
Catégorie
Chiffrement
API affectées
Entity Framework Core (infrastructure d'entité de base)
Changements cassants d’Entity Framework Core
Globalisation
Les paramètres régionaux « C » sont mappés sur les paramètres régionaux invariants
.NET Core 2.2 et les versions antérieures dépendent du comportement d’ICU par défaut, qui mappe les paramètres régionaux « C » aux paramètres régionaux en_US_POSIX. Les paramètres régionaux en_US_POSIX ont un comportement de classement indésirable, car ils ne prennent pas en charge les comparaisons de chaînes insensibles à la casse. Étant donné que certaines distributions Linux définissent les paramètres régionaux « C » comme paramètres régionaux par défaut, les utilisateurs rencontraient un comportement inattendu.
Description de la modification
À partir de .NET Core 3.0, le mappage de paramètres régionaux « C » a changé pour utiliser les paramètres régionaux invariants au lieu de en_US_POSIX. Le mappage des paramètres régionaux « C » à l’invariant est également appliqué à Windows pour la cohérence.
Le mappage de « C » à la culture en_US_POSIX a provoqué la confusion parmi les clients, car en_US_POSIX ne prend pas en charge les opérations de tri/recherche de chaînes insensibles à la casse. Étant donné que les paramètres régionaux « C » sont utilisés comme paramètres régionaux par défaut dans certaines distributions Linux, les clients rencontraient ce comportement non souhaité sur ces systèmes d’exploitation.
Version introduite
3.0
Action recommandée
Rien de particulier à part la conscience de ce changement. Ce changement affecte uniquement les applications qui utilisent le mappage de paramètres régionaux « C ».
Catégorie
Globalisation
API affectées
Toutes les API de classement et de culture sont affectées par cette modification.
MSBuild
Modification du nom du fichier manifeste de ressources
À compter de .NET Core 3.0, par défaut, MSBuild génère un autre nom de fichier manifeste pour les fichiers de ressources.
Version introduite
3.0
Description de la modification
Avant .NET Core 3.0, si aucune métadonnées LogicalName, ManifestResourceName ou DependentUpon ont été spécifiées pour un élément EmbeddedResource dans le fichier projet, MSBuild générait un nom de fichier manifeste dans le modèle <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources. Si RootNamespace n’est pas défini dans le fichier projet, il est défini par défaut sur le nom du projet. Par exemple, le nom du manifeste généré pour un fichier de ressources nommé Form1.resx dans le répertoire du projet racine était MyProject.Form1.resources.
À compter de .NET Core 3.0, si un fichier de ressources est colocalisé avec un fichier source du même nom (par exemple, Form1.resx et Form1.cs), MSBuild utilise des informations de type du fichier source pour générer le nom du fichier manifeste dans le modèle<Namespace>.<ClassName>.resources. L’espace de noms et le nom de classe sont extraits du premier type dans le fichier source colocalisé. Par exemple, le nom du manifeste généré pour un fichier de ressources nommé Form1.resx colocalisé avec un fichier source nommé Form1.cs est MyNamespace.Form1.resources. La principale chose à noter est que la première partie du nom de fichier est différente des versions antérieures de .NET Core (MyNamespace au lieu de MyProject).
Note
Si vous avez des métadonnées LogicalName, ManifestResourceName ou DependentUpon spécifiées sur un élément EmbeddedResource dans le fichier projet, cette modification n’affecte pas ce fichier de ressources.
Cette modification cassante a été introduite avec l’ajout de la propriété EmbeddedResourceUseDependentUponConvention aux projets .NET Core. Par défaut, les fichiers de ressources ne sont pas répertoriés explicitement dans un fichier projet .NET Core. Ils n’ont donc aucune métadonnées DependentUpon pour spécifier comment nommer le fichier .resources généré. Quand EmbeddedResourceUseDependentUponConvention est défini truesur, qui est la valeur par défaut, MSBuild recherche un fichier source colocalisé et extrait un espace de noms et un nom de classe à partir de ce fichier. Si vous définissez EmbeddedResourceUseDependentUponConvention sur false, MSBuild génère le nom du manifeste en fonction du comportement précédent, qui combine RootNamespace et le chemin du fichier relatif.
Action recommandée
Dans la plupart des cas, aucune action n’est requise de la part du développeur et votre application devrait continuer à fonctionner. Toutefois, si ce changement arrête votre application, vous pouvez :
Modifier votre code pour avoir un nouveau nom de manifeste.
Désactiver la nouvelle convention d’affectation de noms en définissant
EmbeddedResourceUseDependentUponConventionsurfalsedans votre fichier projet.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
Catégorie
MSBuild
API affectées
N/A
Mise en réseau
La valeur par défaut de HttpRequestMessage.Version est passée à 1.1
La valeur par défaut de la propriété System.Net.Http.HttpRequestMessage.Version est passée de 2.0 à 1.1.
Version introduite
3.0
Description de la modification
Dans .NET Core 1.0 à 2.0, la valeur par défaut de la propriété System.Net.Http.HttpRequestMessage.Version est 1.1. À compter de .NET Core 2.1, il a été remplacé par la version 2.1.
À compter de .NET Core 3.0, le numéro de version par défaut retourné par la propriété System.Net.Http.HttpRequestMessage.Version est de nouveau 1.1.
Action recommandée
Mettez à jour votre code s’il dépend de la propriété System.Net.Http.HttpRequestMessage.Version qui retourne une valeur par défaut de 2.0.
Catégorie
Mise en réseau
API affectées
Windows Forms
- Control.DefaultFont a été changé en Segoe UI 9 pt
- Modernisation de FolderBrowserDialog
- Attribut Serializable supprimé de certains types de Windows Forms
- Commutateur de compatibilité AllowUpdateChildControlIndexForTabControls non pris en charge
- Commutateur de compatibilité DomainUpDown.UseLegacyScrolling non pris en charge
- Commutateur de compatibilité DoNotLoadLatestRichEditControl non pris en charge
- Commutateur de compatibilité DoNotSupportSelectAllShortcutInMultilineTextBox non pris en charge
- Commutateur de compatibilité DontSupportReentrantFilterMessage non pris en charge
- Commutateur de compatibilité EnableVisualStyleValidation non pris en charge
- Commutateur de compatibilité UseLegacyContextMenuStripSourceControlValue non pris en charge
- Commutateur de compatibilité UseLegacyImages non pris en charge
- Les modèles About et SplashScreen ne fonctionnent pas pour Visual Basic
La police de contrôle par défaut a été modifiée en Segoe UI 9 pt
Description de la modification
Dans .NET Framework, la propriété Control.DefaultFont a été définie sur Microsoft Sans Serif 8.25 pt. L’image suivante montre une fenêtre qui utilise la police par défaut.

À compter de .NET Core 3.0, la police par défaut est définie sur Segoe UI 9 pt (la même police que SystemFonts.MessageBoxFont). En raison de cette modification, les formulaires et les contrôles ont été agrandis d'environ 27% pour s'adapter à la taille plus grande de la nouvelle police par défaut. Par exemple :

Cette modification a été apportée pour s’aligner sur les instructions relatives à l’expérience utilisateur (UX) Windows.
Version introduite
3.0
Action recommandée
En raison de la modification de la taille des formulaires et des contrôles, assurez-vous que votre application s’affiche correctement.
Pour conserver la police d’origine d’un formulaire unique, définissez sa police par défaut sur Microsoft Sans Serif 8.25 pt. Par exemple :
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
Vous pouvez également modifier la police par défaut d’une application entière de l’une des manières suivantes :
En définissant la propriété MSBuild
ApplicationDefaultFontsur « Microsoft Sans Serif, 8.25pt ». Il s’agit de la technique préférée, car elle permet à Visual Studio d’utiliser les nouveaux paramètres dans le concepteur.<PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup>En appelant Application.SetDefaultFont(Font).
class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f)); Application.Run(new Form1()); } }
Catégorie
- Windows Forms
API affectées
Aucun.
Modernisation de FolderBrowserDialog
Le contrôle FolderBrowserDialog a changé dans les applications Windows Forms pour .NET Core.
Description de la modification
Dans le .NET Framework, Windows Forms utilise la boîte de dialogue suivante pour le contrôle FolderBrowserDialog :

Dans .NET Core 3.0, Windows Forms utilise un contrôle COM plus récent introduit dans Windows Vista :

Version introduite
3.0
Action recommandée
La boîte de dialogue est automatiquement mise à niveau.
Si vous souhaitez conserver la boîte de dialogue d’origine, définissez la propriété FolderBrowserDialog.AutoUpgradeEnabled sur false avant d’afficher la boîte de dialogue, comme illustré par le fragment de code suivant :
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Catégorie
Windows Forms
API affectées
L'attribut "SerializableAttribute" supprimé de certains types Windows Forms
Le SerializableAttribute a été supprimé de certaines classes Windows Forms qui n’ont aucun scénario de sérialisation binaire connu.
Description de la modification
Les types suivants sont décorés avec la SerializableAttribute dans .NET Framework, mais l’attribut a été supprimé dans .NET Core :
System.InvariantComparer- System.ComponentModel.Design.ExceptionCollection
- System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.Design.Serialization.CodeDomComponentSerializationService.CodeDomSerializationStore- System.Drawing.Design.ToolboxItem
System.Resources.ResXNullRefSystem.Resources.ResXDataNodeSystem.Resources.ResXFileRef- System.Windows.Forms.Cursor
System.Windows.Forms.NativeMethods.MSOCRINFOSTRUCTSystem.Windows.Forms.NativeMethods.MSG
Historiquement, ce mécanisme de sérialisation a eu de graves problèmes de maintenance et de sécurité. La maintenance SerializableAttribute sur les types signifie que ces types doivent être testés pour les modifications de sérialisation de version à version et potentiellement les modifications de sérialisation de framework à framework. Cela rend plus difficile l’évolution de ces types et peut être coûteux à maintenir. Ces types n’ont aucun scénario de sérialisation binaire connu, ce qui réduit l’impact de la suppression de l’attribut.
Pour plus d'informations, voir Sérialisation binaire.
Version introduite
3.0
Action recommandée
Mettez à jour tout code qui peut dépendre de ces types marqués comme sérialisables.
Catégorie
Windows Forms
API affectées
- Aucun
Commutateur de compatibilité AllowUpdateChildControlIndexForTabControls non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls est pris en charge dans Windows Forms sur .NET Framework 4.6 et versions ultérieures, mais il n’est pas pris en charge sur .NET Core ou .NET 5.0 et versions ultérieures.
Description de la modification
Dans .NET Framework 4.6 et versions ultérieures, la sélection d’un onglet réorganise sa collection de contrôles. Le commutateur de compatibilité Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls permet à une application d’ignorer cette réorganisation lorsque ce comportement n’est pas souhaitable.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
- Aucun
Commutateur de compatibilité DomainUpDown.UseLegacyScrolling non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, introduit dans .NET Framework 4.7.1, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.
Description de la modification
À compter de .NET Framework 4.7.1, le commutateur de compatibilité Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling a permis aux développeurs de refuser les actions indépendantes de DomainUpDown.DownButton() et de DomainUpDown.UpButton(). Le commutateur a restauré le comportement hérité, dans lequel le DomainUpDown.UpButton() est ignoré si le texte de contexte est présent, et le développeur doit utiliser l'action DomainUpDown.DownButton() sur le contrôle avant d'exécuter l'action DomainUpDown.UpButton(). Pour plus d’informations, consultez l’élément <AppContextSwitchOverrides>.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
Commutateur de compatibilité DoNotLoadLatestRichEditControl non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyImages, introduit dans .NET Framework 4.7.1, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.
Description de la modification
Dans .NET Framework 4.6.2 et les versions précédentes, le contrôle RichTextBox instancie le contrôle RichEdit Win32 v3.0 et pour les applications qui ciblent .NET Framework 4.7.1, le contrôle RichTextBox instancie RichEdit v4.1 (dans msftedit.dll). Le commutateur de compatibilité Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl a été introduit pour permettre aux applications qui ciblent .NET Framework 4.7.1 et versions ultérieures de refuser le nouveau contrôle RichEdit v4.1 et d’utiliser l’ancien contrôle RichEdit v3 à la place.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl n’est pas pris en charge. Seules les nouvelles versions du contrôle RichTextBox sont prises en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
Commutateur de compatibilité DoNotSupportSelectAllShortcutInMultilineTextBox non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, introduit dans .NET Framework 4.6.1, n’est pas pris en charge dans Windows Forms sur .NET Core et .NET 5.0 et versions ultérieures.
Description de la modification
À partir de .NET Framework 4.6.1, la sélection de la touche de raccourci Ctrl + A dans un contrôle TextBox permet de sélectionner tout le texte. Dans .NET Framework 4.6 et les versions précédentes, la sélection de la touche de raccourciSwitch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox a été introduit dans .NET Framework 4.6.1 pour conserver le comportement d’origine. Pour plus d’informations, consultez TextBox.ProcessCmdKey.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
- Aucun
Commutateur de compatibilité DontSupportReentrantFilterMessage non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, introduit dans .NET Framework 4.6.1, n’est pas pris en charge dans Windows Forms sur .NET Core et .NET 5.0 et versions ultérieures.
Description de la modification
À compter du .NET Framework 4.6.1, le commutateur de compatibilité Switch.System.Windows.Forms.DontSupportReentrantFilterMessage résout les exceptions possibles IndexOutOfRangeException lorsque le message Application.FilterMessage est appelé avec une implémentation de IMessageFilter.PreFilterMessage personnalisée. Pour plus d’informations, consultez Atténuation : implémentations IMessageFilter.PreFilterMessage personnalisées.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.DontSupportReentrantFilterMessage n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
Commutateur de compatibilité EnableVisualStyleValidation non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.EnableVisualStyleValidation n’est pas supporté dans Windows Forms sous .NET Core ou .NET 5.0 et versions ultérieures.
Description de la modification
Dans .NET Framework, le commutateur de compatibilité Switch.System.Windows.Forms.EnableVisualStyleValidation a permis à une application de refuser la validation des styles visuels fournis dans un formulaire numérique.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.EnableVisualStyleValidation n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
- Aucun
Commutateur de compatibilité UseLegacyContextMenuStripSourceControlValue non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, qui a été introduit dans .NET Framework 4.7.2, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.
Description de la modification
À compter de .NET Framework 4.7.2, le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue permet au développeur de refuser le nouveau comportement de la propriété ContextMenuStrip.SourceControl, qui retourne désormais une référence au contrôle de code source. Le comportement précédent de la propriété était de retourner null. Pour plus d’informations, consultez l’élément <AppContextSwitchOverrides>.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
Commutateur de compatibilité UseLegacyImages non pris en charge
Le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyImages, qui a été introduit dans .NET Framework 4.8, n’est pas pris en charge dans Windows Forms sur .NET Core ou .NET 5.0 et versions ultérieures.
Description de la modification
À compter de .NET Framework 4.8, le commutateur de compatibilité Switch.System.Windows.Forms.UseLegacyImages a résolu les problèmes de mise à l’échelle d’images possibles dans les scénarios ClickOnce dans des environnements DPI élevés. Lorsqu’il est défini sur true, le commutateur permet à l’utilisateur de restaurer la mise à l’échelle d’images héritées sur des écrans haute résolution dont la mise à l’échelle est définie sur plus de 100%. Pour plus d’informations, consultez les notes de publication de .NET Framework 4.8 sur GitHub.
Dans .NET Core et .NET 5.0 et versions ultérieures, le commutateur Switch.System.Windows.Forms.UseLegacyImages n’est pas pris en charge.
Version introduite
3.0
Action recommandée
Supprimez le commutateur. Le commutateur n’est pas pris en charge et aucune autre fonctionnalité n’est disponible.
Catégorie
Windows Forms
API affectées
- Aucun
Les modèles À propos et SplashScreen sont cassés
Les fichiers About.vb et SplashScreen.vb générés par Visual Studio contiennent des références aux types dans l'espace de noms My qui ne sont pas disponibles dans l'.NET Core 3.0 et 3.1.
Version introduite
3.0
Description de la modification
.NET Core 3.0 et 3.1 ne contiennent pas de prise en charge complète de Visual Basic My. Les modèles de formulaires About et SplashScreen dans Les applications Visual Studio pour Visual Basic Windows Forms font référence aux propriétés du My.Application.Info type qui ne sont pas disponibles.
Action recommandée
La prise en charge de Visual Basic My a été améliorée dans .NET 5, mettez à niveau votre projet vers .NET 5 ou version ultérieure.
- ou -
Corrigez les erreurs du compilateur dans les types About et SplashScreen dans votre application. Utilisez la System.Reflection.Assembly classe pour obtenir les informations fournies par le My.Application.Info type. Un port normal des deux formulaires est disponible ici.
Conseil
Il s’agit d’exemples de code et non optimisé. La liste des attributs doit être mise en cache pour réduire le temps de chargement du formulaire.
À propos
Imports System.Reflection
Public NotInheritable Class About
Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Set the title of the form.
Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title
If String.IsNullOrEmpty(applicationTitle) Then
applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
End If
Me.Text = String.Format("About {0}", applicationTitle)
' Initialize all of the text displayed on the About Box.
' TODO: Customize the application's assembly information in the "Application" pane of the project
' properties dialog (under the "Project" menu).
Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
End Sub
Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
Me.Close()
End Sub
End Class
SplashScreen
Imports System.Reflection
Public NotInheritable Class SplashScreen
Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Set up the dialog text at runtime according to the application's assembly information.
'TODO: Customize the application's assembly information in the "Application" pane of the project
' properties dialog (under the "Project" menu).
'Application title
Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title
If String.IsNullOrEmpty(appTitle) Then
appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
End If
ApplicationTitle.Text = appTitle
Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version
'Format the version information using the text set into the Version control at design time as the
' formatting string. This allows for effective localization if desired.
' Build and revision information could be included by using the following code and changing the
' Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar. See
' String.Format() in Help for more information.
'
' Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)
Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)
'Copyright info
Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
End Sub
End Class
Catégorie
Visual Basic Windows Forms
API affectées
Aucun
WPF (Windows Presentation Foundation)
Comportement de glisser-déplacer modifié sur les éditeurs de texte
.NET Core 3.0 a introduit une modification de la façon dont les contrôles de l’éditeur de texte créent un System.Windows.DataObject lors du glissement de texte vers un autre contrôle. La modification a désactivé la conversion automatique, ce qui entraîne la conservation des données sous la forme DataFormats.Text ou DataFormats.UnicodeText au lieu de les convertir en DataFormats.StringFormat.
Version introduite
.NET Core 3.0
Catégorie
Windows Presentation Foundation
Comportement précédent
Le type de données sur System.Windows.DataObject lors du glissement de texte à partir d’un contrôle d’éditeur de texte était DataFormats.StringFormat.
Nouveau comportement
Le type de données sur System.Windows.DataObject lors du glissement de texte à partir d’un contrôle d’éditeur de texte est DataFormats.Text ou DataFormats.UnicodeText.
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
La modification était involontaire.
Action recommandée
Cette modification a été annulée dans .NET 7. Effectuez une mise à niveau vers .NET 7 ou version ultérieure.