RDG002:无法解析终结点处理程序

规则 ID RDG002
修复是中断修复还是非中断修复 非中断

原因

当终结点包含具有无法静态分析的路由处理程序时,请求委托生成器会发出此诊断。

规则说明

请求委托生成器在编译时运行,并且需要能够在应用中静态分析路由处理程序。 当前实现仅支持作为 lambda 表达式提供的、作为方法组引用提供的或者作为只读字段或变量引用提供的路由处理程序。

以下代码生成 RDG002 警告,因为路由处理程序作为对方法的引用提供:

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();

var del = Wrapper.GetTodos;
app.MapGet("/v1/todos", del);

app.Run();

record Todo(int Id, string Task);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

class Wrapper
{
    public static Func<IResult> GetTodos = () =>
        Results.Ok(new Todo(1, "Write test fix"));
}

如何解决冲突

使用支持的语法声明路由处理程序,例如内联 lambda:

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.MapGet("/v1/todos", () => Results.Ok(new Todo(1, "Write tests")));

app.Run();

record Todo(int Id, string Task);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

何时禁止显示警告

可以安全消除此警告。 消除后,框架会回退为在运行时生成请求委托。