Nouveautés de ASP.NET Core 10.0
Cet article met en évidence les changements les plus importants dans ASP.NET Core 10.0 avec des liens vers la documentation pertinente.
Cet article sera mis à jour à mesure que de nouvelles versions préliminaires sont mises à disposition. Consultez la page d’annonce Asp.Net Core jusqu’à ce que cette page soit mise à jour.
Blazor
Cette section décrit les nouvelles fonctionnalités de Blazor.
paramètre QuickGridRowClass
Appliquez une classe de feuille de style à une ligne de la grille en fonction de l’élément de ligne à l’aide du nouveau paramètre RowClass
. Dans l’exemple suivant, la méthode GetRowCssClass
est appelée sur chaque ligne pour appliquer conditionnellement une classe de feuille de style en fonction de l’élément de ligne :
<QuickGrid ... RowClass="GetRowCssClass">
...
</QuickGrid>
@code {
private string GetRowCssClass(MyGridItem item) =>
item.IsArchived ? "row-archived" : null;
}
Pour plus d’informations, consultez ASP.NET Core Blazor `QuickGrid` composant.
Script Blazor comme ressource Web statique
Dans les versions antérieures de .NET, le script Blazor est servi à partir d’une ressource incorporée dans l’infrastructure partagée ASP.NET Core. Dans .NET 10 ou version ultérieure, le script Blazor est servi de ressource web statique avec compression automatique et empreinte digitale.
Pour plus d’informations, consultez les ressources suivantes :
- Structure de projet Blazor ASP.NET Core
- fichiers statiques ASP.NET Core Blazor
Points forts du modèle de routage
L’attribut [Route]
prend désormais en charge la mise en surbrillance de la syntaxe de routage pour vous aider à visualiser la structure du modèle de routage :
SignalR
Cette section décrit les nouvelles fonctionnalités de SignalR.
API minimales
Cette section décrit les nouvelles fonctionnalités pour les API minimales.
OpenAPI
Cette section décrit les nouvelles fonctionnalités d’OpenAPI.
Prise en charge d'OpenAPI 3.1
ASP.NET Core a ajouté la prise en charge de la génération de documents OpenAPI version 3.1 dans .NET 10. Malgré ce changement de version mineur, OpenAPI 3.1 est une mise à jour importante de la spécification OpenAPI, en particulier avec le support complet de JSON Schema draft 2020-12.
Voici quelques-unes des modifications que vous verrez dans le document OpenAPI généré :
- Les types nullables n’ont plus la propriété
nullable: true
dans le schéma. - Au lieu d’une propriété
nullable: true
, ils ont un mot clétype
dont la valeur est un tableau qui inclutnull
comme l’un des types.
Avec cette fonctionnalité, la version OpenAPI par défaut pour les documents générés est3.1
. La version peut être modifiée en définissant explicitement la propriété OpenApiVersion du OpenApiOptions dans le paramètre délégué configureOptions
de AddOpenApi.
builder.Services.AddOpenApi(options =>
{
// Specify the OpenAPI version to use.
options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
});
Lors de la génération du document OpenAPI au moment de la génération, la version OpenAPI peut être sélectionnée en définissant la --openapi-version
dans l’élément MSBuild OpenApiGenerateDocumentsOptions
.
<!-- Configure build-time OpenAPI generation to produce an OpenAPI 3.0 document. -->
<OpenApiGenerateDocumentsOptions>--openapi-version OpenApi3_0</OpenApiGenerateDocumentsOptions>
La prise en charge d'OpenAPI 3.1 a été ajoutée en premier lieu dans le PR suivant.
Changements cassants de l'OpenAPI 3.1
La prise en charge d’OpenAPI 3.1 nécessite une mise à jour de la bibliothèque de OpenAPI.NET sous-jacente vers une nouvelle version majeure, 2.0. Cette nouvelle version comporte quelques changements cassants par rapport à la version précédente. Les changements cassants peuvent avoir un impact sur les applications qui ont des transformateurs de documents, d'opérations ou de schémas.
L’un des changements les plus significatifs est que la classe OpenApiAny
a été supprimée en faveur de l’utilisation directe de JsonNode
. Les transformateurs qui utilisent OpenApiAny
doivent être mis à jour pour utiliser JsonNode
. Le diff suivant montre les modifications apportées au transformateur de schéma de .NET 9 à .NET 10 :
options.AddSchemaTransformer((schema, context, cancellationToken) =>
{
if (context.JsonTypeInfo.Type == typeof(WeatherForecast))
{
- schema.Example = new OpenApiObject
+ schema.Example = new JsonObject
{
- ["date"] = new OpenApiString(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")),
+ ["date"] = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"),
- ["temperatureC"] = new OpenApiInteger(0),
+ ["temperatureC"] = 0,
- ["temperatureF"] = new OpenApiInteger(32),
+ ["temperatureF"] = 32,
- ["summary"] = new OpenApiString("Bracing"),
+ ["summary"] = "Bracing",
};
}
return Task.CompletedTask;
});
Notez que ces modifications sont nécessaires même lorsqu'on ne configure que la version OpenAPI à 3.0.
OpenAPI dans Yaml
ASP.NET prend désormais en charge le service du document OpenAPI généré au format YAML. YAML peut être plus concis que JSON, ce qui élimine les accolades et les guillemets quand ceux-ci peuvent être déduits. YAML prend également en charge les chaînes à plusieurs lignes, qui peuvent être utiles pour de longues descriptions.
Pour configurer une application pour servir le document OpenAPI généré au format YAML, spécifiez le point de terminaison de l’appel MapOpenApi avec un suffixe « .yml » ou « .yml », comme illustré dans l’exemple suivant :
app.MapOpenApi("/openapi/{documentName}.yaml");
Prise en charge des points suivants :
- YAML est actuellement disponible uniquement pour l’OpenAPI servi à partir du point d'accès OpenAPI.
- La génération de documents OpenAPI au format YAML au moment de la génération est ajoutée dans une préversion ultérieure.
Consultez ce PR qui a ajouté le support pour servir le document OpenAPI généré au format YAML.
Description de la réponse sur ProducesResponseType
Les attributs ProducesAttribute, ProducesResponseTypeAttributeet ProducesDefaultResponseType acceptent désormais un paramètre facultatif de type chaîne, Description
, qui définit la description de la réponse. Voici un exemple :
[HttpGet(Name = "GetWeatherForecast")]
[ProducesResponseType<IEnumerable<WeatherForecast>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
public IEnumerable<WeatherForecast> Get()
{
Et l’OpenAPI généré :
"responses": {
"200": {
"description": "The weather forecast for the next 5 days.",
"content": {
Contribution communautaire de Sander ten Brinke
Authentification et autorisation
Cette section décrit les nouvelles fonctionnalités pour l’authentification et l’autorisation.
Divers
Cette section décrit diverses nouvelles fonctionnalités dans ASP.NET Core 10.0.
Meilleure prise en charge des applications de test avec des instructions de niveau supérieur
.NET 10 offre désormais une meilleure prise en charge des applications de test qui utilisent des instructions de niveau supérieur . Auparavant, les développeurs devaient ajouter manuellement public partial class Program
au fichier Program.cs
afin que le projet de test puisse référencer le Program class
. public partial class Program
était nécessaire parce que la fonctionnalité d'instruction de premier niveau de C# 9 générait un Program class
qui était déclaré comme interne.
Dans .NET 10, un générateur source est utilisé pour générer la déclaration public partial class Program
si le programmeur ne l’a pas déclaré explicitement. En outre, un analyseur a été ajouté pour détecter quand public partial class Program
est déclaré explicitement et conseille au développeur de le supprimer.
Les PR suivants ont contribué à cette fonctionnalité :
Détecter si l’URL est locale à l’aide de RedirectHttpResult.IsLocalUrl
Utilisez la nouvelle méthode d’assistance RedirectHttpResult.IsLocalUrl(url)
pour détecter si une URL est locale. Une URL est considérée comme locale si les valeurs suivantes sont remplies :
- Il n'y a pas de section « hôte » ou « autorité ».
- Il s'agit d'un chemin d'accès absolu.
Les URL utilisant chemins virtuels"~/"
sont également locales.
IsLocalUrl
est utile pour valider les URL avant de rediriger vers elles afin de prévenir les attaques par redirection ouverte.
if (RedirectHttpResult.IsLocalUrl(url))
{
return Results.LocalRedirect(url);
}
Merci @martincostello pour cette contribution !