Delen via


Wat is er nieuw in ASP.NET Core 10.0

In dit artikel worden de belangrijkste wijzigingen in ASP.NET Core 10.0 beschreven met koppelingen naar relevante documentatie.

Dit artikel wordt bijgewerkt naarmate er nieuwe preview-versies beschikbaar worden gesteld. Zie de Asp.Net Core-aankondigingspagina totdat deze pagina is bijgewerkt.

Blazor

In deze sectie worden nieuwe functies voor Blazorbeschreven.

parameter QuickGridRowClass

Pas een opmaakmodelklasse toe op een rij van de grid op basis van het item van de rij met behulp van de nieuwe parameter RowClass. In het volgende voorbeeld wordt de methode GetRowCssClass aangeroepen op elke rij om voorwaardelijk een stijlklasse toe te passen op basis van het item in de rij.

<QuickGrid ... RowClass="GetRowCssClass">
    ...
</QuickGrid>

@code {
    private string GetRowCssClass(MyGridItem item) =>
        item.IsArchived ? "row-archived" : null;
}

Zie ASP.NET Core BlazorQuickGridcomponentvoor meer informatie.

Blazor script als statisch webbestand

In eerdere versies van .NET wordt het Blazor-script geleverd vanuit een ingesloten resource in het gedeelde ASP.NET Core-framework. In .NET 10 of hoger wordt het Blazor-script geleverd als een statische webasset met automatische compressie en vingerafdruk.

Zie de volgende bronnen voor meer informatie:

Hoogtepunten van routesjabloon

Het kenmerk [Route] ondersteunt nu markering van routesyntaxis om de structuur van de routesjabloon te visualiseren:

routesjabloonpatroon van een routekenmerk voor de tellerwaarde toont syntaxismarkeringen

SignalR

In deze sectie worden nieuwe functies voor SignalRbeschreven.

Minimale APIs

In deze sectie worden nieuwe functies voor minimale API's beschreven.

OpenAPI

In deze sectie worden nieuwe functies voor OpenAPI beschreven.

Ondersteuning voor OpenAPI 3.1

ASP.NET Core heeft ondersteuning toegevoegd voor het genereren van OpenAPI versie 3.1 documenten in .NET 10. Ondanks de kleine versie-increment is OpenAPI 3.1 een belangrijke update van de OpenAPI-specificatie, met name met volledige ondersteuning voor JSON Schema draft 2020-12.

Enkele van de wijzigingen die u in het gegenereerde OpenAPI-document ziet, zijn:

  • Nullable typen hebben niet meer de nullable: true eigenschap in het schema.
  • In plaats van een nullable: true eigenschap hebben ze een type trefwoord waarvan de waarde een matrix is die null bevat als een van de typen.

Met deze functie wordt de standaardVersie van OpenAPI voor gegenereerde documenten3.1. De versie kan worden gewijzigd door de eigenschap OpenApiVersion van de OpenApiOptions- in de gedelegeerde parameter configureOptions van AddOpenApi-expliciet in te stellen.

builder.Services.AddOpenApi(options =>
{
    // Specify the OpenAPI version to use.
    options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
});

Wanneer u het OpenAPI-document tijdens de build genereert, kan de OpenAPI-versie worden geselecteerd door de --openapi-version in te stellen in het OpenApiGenerateDocumentsOptions MSBuild-item.

    <!-- Configure build-time OpenAPI generation to produce an OpenAPI 3.0 document. -->
    <OpenApiGenerateDocumentsOptions>--openapi-version OpenApi3_0</OpenApiGenerateDocumentsOptions>

Ondersteuning voor OpenAPI 3.1 werd vooral toegevoegd in de volgende PR.

Breekende wijzigingen in OpenAPI 3.1

Ondersteuning voor OpenAPI 3.1 vereist een update naar de onderliggende OpenAPI.NET-bibliotheek naar een nieuwe primaire versie, 2.0. Deze nieuwe versie heeft enkele belangrijke wijzigingen ten opzichte van de vorige versie. De ingrijpende wijzigingen kunnen van invloed zijn op apps als deze document-, bewerking- of schematransformaties hebben.

Een van de belangrijkste wijzigingen is dat de OpenApiAny klasse is verwijderd ten gunste van het rechtstreeks gebruiken van JsonNode. Transformatoren die gebruikmaken van OpenApiAny moeten worden bijgewerkt om JsonNodete kunnen gebruiken. In de volgende diff ziet u de wijzigingen in de schematransformator van .NET 9 naar .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;
});

Houd er rekening mee dat deze wijzigingen nodig zijn, zelfs wanneer alleen de OpenAPI-versie wordt geconfigureerde naar 3.0.

OpenAPI in Yaml

ASP.NET biedt nu ondersteuning voor het leveren van het gegenereerde OpenAPI-document in YAML-indeling. YAML kan beknopter zijn dan JSON, waarbij accolades en aanhalingstekens worden geëlimineerd wanneer deze kunnen worden afgeleid. YAML ondersteunt ook tekenreeksen met meerdere regels, wat handig kan zijn voor lange beschrijvingen.

Als u een app wilt configureren voor het gegenereerde OpenAPI-document in YAML-indeling, geeft u het eindpunt op in de MapOpenApi-aanroep met het achtervoegsel '.yaml' of '.yml', zoals wordt weergegeven in het volgende voorbeeld:

app.MapOpenApi("/openapi/{documentName}.yaml");

Ondersteuning voor:

  • YAML is momenteel alleen beschikbaar voor de OpenAPI die wordt geleverd vanuit het OpenAPI-eindpunt.
  • Het genereren van OpenAPI-documenten in YAML-indeling tijdens de build wordt toegevoegd in een toekomstige preview.

Zie deze PR die ondersteuning heeft toegevoegd voor het uitserveren van het gegenereerde OpenAPI-document in YAML-formaat.

Beschrijving van de reactie op ProducesResponseType

De ProducesAttribute, ProducesResponseTypeAttributeen ProducesDefaultResponseType kenmerken accepteren nu een optionele tekenreeksparameter, Description, waarmee de beschrijving van het antwoord wordt ingesteld. Hier volgt een voorbeeld:

[HttpGet(Name = "GetWeatherForecast")]
[ProducesResponseType<IEnumerable<WeatherForecast>>(StatusCodes.Status200OK, Description = "The weather forecast for the next 5 days.")]
public IEnumerable<WeatherForecast> Get()
{

En de gegenereerde OpenAPI:

        "responses": {
          "200": {
            "description": "The weather forecast for the next 5 days.",
            "content": {

Gemeenschapsbijdrage door Sander ten Brinke🙏

Verificatie en autorisatie

In deze sectie worden nieuwe functies voor verificatie en autorisatie beschreven.

Allerlei

In deze sectie worden diverse nieuwe functies in ASP.NET Core 10.0 beschreven.

Betere ondersteuning voor het testen van apps met instructies op het hoogste niveau

.NET 10 biedt nu betere ondersteuning voor het testen van apps die gebruikmaken van top-level instructies. Voorheen moesten ontwikkelaars handmatig public partial class Program toevoegen aan het Program.cs-bestand, zodat het testproject naar de Program classkon verwijzen. public partial class Program was nodig omdat de top-level statement functie in C# 9 een Program class heeft gegenereerd die is gedeclareerd als interne.

In .NET 10 wordt een brongenerator gebruikt om de declaratie public partial class Program te genereren als de programmeur deze niet expliciet heeft gededeclaratie. Daarnaast is er een analyse toegevoegd om te detecteren wanneer public partial class Program expliciet wordt gedeclareerd en adviseert de ontwikkelaar om deze te verwijderen.

afbeelding

De volgende pull-aanvragen hebben aan deze functionaliteit bijgedragen:

Detecteren of een URL lokaal is met RedirectHttpResult.IsLocalUrl

Gebruik de nieuwe RedirectHttpResult.IsLocalUrl(url) helpermethode om te detecteren of een URL lokaal is. Een URL wordt beschouwd als lokaal als het volgende waar is:

URL's die gebruikmaken van virtuele paden"~/" zijn ook lokaal.

IsLocalUrl is handig voor het valideren van URL's voordat u ze omleidt om open omleidingsaanvallente voorkomen.

if (RedirectHttpResult.IsLocalUrl(url))
{
    return Results.LocalRedirect(url);
}

Bedankt @martincostello voor deze bijdrage!