Compartir a través de


Novedades de ASP.NET Core 10.0

En este artículo se resaltan los cambios más significativos de ASP.NET Core 10.0 con vínculos a la documentación pertinente.

Este artículo se actualizará a medida que se publiquen nuevas versiones preliminares. Consulte la página de anuncio de Asp.Net Core hasta que se actualice esta página.

Blazor

En esta sección se describen las nuevas características de Blazor.

parámetro QuickGridRowClass

Aplique una clase de hoja de estilos a una fila de la cuadrícula basada en el elemento de fila mediante el nuevo parámetro RowClass. En el ejemplo siguiente, se llama al método GetRowCssClass en cada fila para aplicar condicionalmente una clase de hoja de estilos basada en el elemento de fila:

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

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

Para obtener más información, vea ASP.NET Core Blazor `QuickGrid` componente.

Blazor script como recurso web estático

En versiones anteriores de .NET, el script de Blazor se sirve desde un recurso incrustado en el marco compartido de ASP.NET Core. En .NET 10 o posterior, el script de Blazor se sirve como un recurso web estático con compresión automática y huella digital.

Para obtener más información, consulte los siguientes recursos:

Resaltados de la plantilla de ruta

El atributo [Route] ahora admite el resaltado de sintaxis de ruta para ayudar a visualizar la estructura de la plantilla de ruta:

El patrón de plantilla de ruta de un atributo de ruta para el valor de contador muestra el resaltado de sintaxis

SignalR

En esta sección se describen las nuevas características de SignalR.

API mínimas

En esta sección se describen las nuevas características de las API mínimas.

OpenAPI

En esta sección se describen las nuevas características de OpenAPI.

Compatibilidad con OpenAPI 3.1

ASP.NET Core ha agregado compatibilidad para generar documentos de OpenAPI versión 3.1 en .NET 10. A pesar del aumento de la versión secundaria, OpenAPI 3.1 es una actualización significativa de la especificación de OpenAPI, en particular con compatibilidad completa con esquema JSON borrador 2020-12.

Algunos de los cambios que verá en el documento openAPI generado incluyen:

  • Los tipos anulables ya no tienen la propiedad nullable: true en el esquema.
  • En lugar de una propiedad nullable: true, tienen una palabra clave type cuyo valor es una matriz que incluye null como uno de los tipos.

Con esta característica, la versión predeterminada de OpenAPI para los documentos generados es3.1. La versión se puede cambiar estableciendo explícitamente la propiedad OpenApiVersion del OpenApiOptions en el parámetro delegado configureOptions de AddOpenApi.

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

Al generar el documento de OpenAPI en tiempo de compilación, se puede seleccionar la versión de OpenAPI estableciendo el --openapi-version en el elemento de MSBuild de OpenApiGenerateDocumentsOptions.

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

La compatibilidad con OpenAPI 3.1 se agregó principalmente en el siguiente PR.

Cambios importantes en OpenAPI 3.1

La compatibilidad con OpenAPI 3.1 requiere una actualización de la biblioteca de OpenAPI.NET subyacente a una nueva versión principal, 2.0. Esta nueva versión tiene algunos cambios importantes de la versión anterior. Los cambios disruptivos pueden afectar a las aplicaciones si tienen transformadores de documentos, operaciones o esquemas.

Uno de los cambios más significativos es que la clase OpenApiAny se ha quitado en favor de usar JsonNode directamente. Los transformadores que usan OpenApiAny deben actualizarse para usar JsonNode. La diferencia siguiente muestra los cambios en el transformador de esquema de .NET 9 a .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;
});

Tenga en cuenta que estos cambios son necesarios incluso cuando solo se configura la versión de OpenAPI a 3.0.

OpenAPI en Yaml

ASP.NET ahora admite el servicio del documento OpenAPI generado en formato YAML. YAML puede ser más conciso que JSON, lo que elimina llaves y comillas cuando se pueden deducir. YAML también admite cadenas de varias líneas, que pueden ser útiles para descripciones largas.

Para configurar una aplicación para que sirva el documento OpenAPI generado en formato YAML, especifique el punto de conexión en la llamada MapOpenApi con un sufijo ".yaml" o ".yml", como se muestra en el ejemplo siguiente:

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

Compatibilidad con:

  • YAML solo está disponible actualmente para OpenAPI servido desde el endpoint de OpenAPI.
  • La generación de documentos de OpenAPI en formato YAML en tiempo de compilación se agrega en una versión preliminar futura.

Consulte este PR que agregó soporte para mostrar el documento OpenAPI generado en formato YAML.

Descripción de la respuesta en ProducesResponseType

Los atributos ProducesAttribute, ProduceResponseTypeAttributey ProducesDefaultResponseType ahora aceptan un parámetro de cadena opcional, Description, que establecerá la descripción de la respuesta. Este es un ejemplo:

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

Y el OpenAPI generado:

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

contribución comunitaria por Sander ten Brinke

Autenticación y autorización

En esta sección se describen las nuevas características de autenticación y autorización.

Misceláneo

En esta sección se describen varias características nuevas de ASP.NET Core 10.0.

Mejor compatibilidad con las aplicaciones de prueba con instrucciones de nivel superior

.NET 10 ahora tiene mejor soporte para probar aplicaciones que usan instrucciones de nivel superior. Anteriormente, los desarrolladores tenían que agregar manualmente public partial class Program al archivo Program.cs para que el proyecto de prueba pudiera hacer referencia al Program class. public partial class Program era necesario porque la declaración de nivel superior de C# 9 generó un Program class, que fue declarado como interno.

En .NET 10, se usa un generador de origen para generar la declaración de public partial class Program si el programador no la ha declarado explícitamente. Además, se ha agregado un analizador para detectar cuándo public partial class Program se declara explícitamente y aconseja al desarrollador que lo quite.

Imagen

Las siguientes solicitudes de incorporación de cambios contribuyeron a esta característica.

Detección de si la dirección URL es local mediante RedirectHttpResult.IsLocalUrl

Use el nuevo método auxiliar de RedirectHttpResult.IsLocalUrl(url) para detectar si una dirección URL es local. Una dirección URL se considera local si se cumple lo siguiente:

Las direcciones URL que usan rutas de acceso virtuales"~/" también son locales.

IsLocalUrl es útil para validar las direcciones URL antes de redirigirlas a ellas para evitar ataques de redirección abierta.

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

¡Gracias @martincostello por esta contribución!