从.NET 5迁移到.NET 6后builder.Use调用歧义问题如何解决?
解决.NET 6中Map路由里Use方法的调用歧义问题
问题原因
.NET 6对UseExtensions类新增了一个重载方法:Use(IApplicationBuilder, Func<HttpContext, RequestDelegate, Task>),而原代码中的异步lambda未明确指定next参数的类型,编译器无法区分它应该匹配Func<HttpContext, Func<Task>, Task>还是新增的重载,因此抛出调用歧义错误。
解决方案
方案一:显式指定next参数类型
直接给lambda中的next参数标注RequestDelegate类型,让编译器明确匹配目标重载:
app.Map("/status", builder => { builder.Use(async (context, RequestDelegate next) => { Log.Debug(context.GetRequestLogString()); context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.WriteAsync("OK"); }); });
方案二:改用Run方法(推荐)
由于你的代码中并未调用next(),属于终端中间件(不会将请求传递到后续管道),使用Run方法更符合语义,同时彻底避开重载歧义问题:
app.Map("/status", builder => { builder.Run(async context => { Log.Debug(context.GetRequestLogString()); context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.WriteAsync("OK"); }); });
内容的提问来源于stack exchange,提问作者SValley_Developer
相关产品推荐
相关产品推荐

