我正在try 为ComponentModel DataAnnotation编写一个c#MinimalApi Endpoint过滤器验证器.我所拥有的是在传递要验证的类型时工作得很好,但我正在try 使从InvocationContext的[FromBody]属性中拉出类型变得更通用一些.下面是我的最大努力,但示例调用返回空值:

var fromBody = invocationContext.Arguments
    .Where(w => Attribute.GetCustomAttribute(w.GetType(), typeof(FromBodyAttribute)) is not null);

我不确定这是否可能,但如果有任何建议,我会很高兴.

推荐答案

FromBodyAttribute通常不适用于实参类型,而适用于处理程序函数参数(请注意,存在一些边缘情况,例如,当AsParametersAttribute is used时).要分析处理程序函数参数,您需要使用端点筛选器工厂,而不是筛选器:

app.MapPost("/foo", ([FromBody] SomeType t) => "bar")
    .AddEndpointFilterFactory((filterFactoryContext, next) =>
    {
        var parameters = filterFactoryContext.MethodInfo.GetParameters();
        var bodyParams = parameters
            .Where(pi => pi.GetCustomAttributes<FromBodyAttribute>().Any())
            .ToArray();
        return invocationContext => next(invocationContext); // create filter based on handler parameters
    });

有关更多信息,请参阅Filters in Minimal API apps: Register a filter using an endpoint filter factory文档.

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

C# Json重新初始化动态类型

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

SortedSet.Remove()不会删除SortedSet.Min返回的元素

ASP.NET Core AutoMapper:如何解决错误 CS0121调用在以下方法或属性之间不明确

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

当我没有此令牌时,为什么语法报告EOF错误?

记录类型';==运算符是否与实现IEquatable<;T&>;的类中的';equals&>方法执行等价比较?

同一组件的多个实例触发相同的事件处理程序

如何从另一个类的列表中按ID取值

C#中使用ReadOnlySpan的泛型类型推理

WPF如何获取有关从一个视图模型更改另一个视图模型的信息

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

在Visual Studio 2022中查找Xamarin模板时遇到问题

在使用.NET EF Core DbContext属性之前,是否应使用null判断

将带有嵌套If-Else的Foreach循环转换为Linq表达式

MudRadioGroup不切换

从列表中跳过和获取条目的优雅方式

如何模拟一个返回OneOf IServiceA,IServiceB的方法?使用Moq