Freigeben über


RDG009: Ungültige geschachtelte AsParameters

Wert
Regel-ID RDG009
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend

Ursache

Diese Diagnose wird vom Anforderungsdelegat-Generator ausgegeben, wenn ein Endpunkt ungültig geschachtelte [AsParameters] enthält.

Regelbeschreibung

Typen, die für die Ersatzbindung über das [AsParameters]-Attribut verwendet werden, dürfen keine geschachtelten Typen enthalten, die ebenfalls mit dem [AsParameters]-Attribut versehen sind:

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder();

var todos = new[]
{
    new Todo(1, "Write tests", DateTime.UtcNow.AddDays(2)),
    new Todo(2, "Fix tests",DateTime.UtcNow.AddDays(1))
};

builder.Services.AddSingleton(todos);
builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});

var app = builder.Build();

app.MapGet("/v1/todos/{id}", ([AsParameters] TodoItemRequest request) =>
{
     return request.Todos.ToList().Find(todoItem => todoItem.Id == request.Id) is Todo todo
    ? Results.Ok(todo)
    : Results.NotFound();
});

app.Run();

struct TodoItemRequest
{
    public int Id { get; set; }
    [AsParameters]
    public Todo[] Todos { get; set; }
}

internal record Todo(int Id, string Task, DateTime DueDate);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}

Behandeln von Verstößen

Entfernen Sie das geschachtelte AsParameters-Attribut:

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder();
var todos = new[]
{
    new Todo(1, "Write tests", DateTime.UtcNow.AddDays(2)),
    new Todo(2, "Fix tests",DateTime.UtcNow.AddDays(1))
};
builder.Services.AddSingleton(todos);
builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});

var app = builder.Build();

app.MapGet("/v1/todos/{id}", ([AsParameters] TodoItemRequest request) =>
{
    return request.Todos.ToList().Find(todoItem => todoItem.Id == request.Id) is Todo todo
    ? Results.Ok(todo)
    : Results.NotFound();
});

app.Run();

struct TodoItemRequest
{
    public int Id { get; set; }
    //[AsParameters]
    public Todo[] Todos { get; set; }
}

internal record Todo(int Id, string Task, DateTime DueDate);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}

Wann sollten Warnungen unterdrückt werden?

Diese Warnung darf nicht unterdrückt werden.