.NET 6 Minimal API报错:未找到Request.TryParse静态方法如何解决?
问题原因
.NET 6 Minimal API默认未启用复杂类型的查询字符串自动绑定机制,你给自定义Request类加了[FromQuery]特性但没有配套的解析支持,框架找不到对应的类型解析方法就会抛出该异常。
解决方案
你可以根据自己的项目需求任选以下一种方案修复:
方案1:替换特性为
[AsParameters](最简单,无需修改其他代码)
直接把接口参数中的[FromQuery]改为.NET 6 Minimal API专属的[AsParameters]特性即可,框架会自动把查询参数映射到复杂类的对应属性上,修改后的接口代码如下:application.MapGet("countries", async ([AsParameters]Request request, IMediator mediator) => { Payload<List<Response>> payload = await mediator.Send(request); return Results.Ok(payload); });方案2:为
Request类实现静态TryParse方法
按照错误提示的要求,给自定义的Request类添加静态解析方法,自己实现从请求参数到Request对象的转换逻辑:public class Request { public List<Int32> Ids { get; set; } = new List<Int32>(); public static bool TryParse(HttpContext context, out Request request) { request = null; // 从查询字符串中获取ids参数 if(context.Request.Query.TryGetValue("Ids", out var idsValues)) { var ids = new List<int>(); foreach(var idStr in idsValues) { if(int.TryParse(idStr, out var id)) { ids.Add(id); } } request = new Request { Ids = ids }; return true; } // 无参数时返回空实例也可以根据业务调整逻辑 request = new Request(); return true; } }方案3:启用完整MVC绑定支持
如果你的项目本身需要使用MVC的全套能力,可以把Program.cs中的builder.Services.AddMvcCore()修改为builder.Services.AddControllers(),修改后原生的[FromQuery]就能正常绑定复杂类型,不过该方案会引入额外的MVC组件,仅适合本身需要用到控制器的项目。
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

