Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Valore | |
---|---|
ID della regola | RDG011 |
La modifica è dirompente o non dirompente | Non separabile |
Causa
Questa diagnostica viene generata dal Request Delegate Generator quando un endpoint contiene un gestore di percorso che cattura un tipo generico.
Descrizione della regola
Gli endpoint che usano parametri di tipo generico non sono supportati. Gli endpoint all'interno MapEndpoints
producono questa diagnostica a causa di un parametro generico <T>
.
using System.Text.Json.Serialization;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0,
AppJsonSerializerContext.Default);
});
var app = builder.Build();
app.MapEndpoints<Todo>();
app.Run();
public static class RouteBuilderExtensions
{
public static IEndpointRouteBuilder MapEndpoints<T>(this IEndpointRouteBuilder app) where T : class, new()
{
app.MapPost("/input", (T value) => value);
app.MapGet("/result", () => new T());
app.MapPost("/input-with-wrapper", (Wrapper<T> value) => value);
app.MapGet("/async", async () =>
{
await Task.CompletedTask;
return new T();
});
return app;
}
}
record Wrapper<T>(T Value);
class Todo
{
public int Id { get; set; }
public string Task { get; set; }
}
[JsonSerializable(typeof(Wrapper<Todo>[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Come correggere le violazioni
Rimuovere il tipo generico dagli endpoint.
using System.Text.Json.Serialization;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0,
AppJsonSerializerContext.Default);
});
var app = builder.Build();
app.MapTodoEndpoints();
app.Run();
public static class TodoRouteBuilderExtensions
{
public static IEndpointRouteBuilder MapTodoEndpoints(this IEndpointRouteBuilder app)
{
app.MapPost("/input", (Todo value) => value);
app.MapGet("/result", () => new Todo(1, "Walk the dog"));
app.MapPost("/input-with-wrapper", (Wrapper<Todo> value) => value);
app.MapGet("/async", async () =>
{
await Task.CompletedTask;
return new Todo(1, "Walk the dog");
});
return app;
}
}
record Wrapper<T>(T Value);
record Todo(int Id, string Task);
[JsonSerializable(typeof(Wrapper<Todo>[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Quando eliminare gli avvisi
Questo avviso può essere eliminato in modo sicuro. In caso di eliminazione, il framework eseguirà il fallback per generare il delegato di richiesta in fase di esecuzione.