ASP.NET Core 6.0 - 最小 API:哪些参数可用于 Map 方法处理路线?

ASP.NET Core 6.0 - Minimal APIs: What parameters are available to Map methods for handling routes?

我是 Minimal API 的新手,它在 ASP.NET Core 6.0 中可用,并且基于 Microsoft 的教程 here and here,可以为 Get 方法定义一个示例路由,如下所示:

app.MapGet("/", () => "Hello World!");

对于Post方法,如下代码is provided

...
app.MapPost("/todoitems", async (Todo todo, TodoDb db) =>
{
    db.Todos.Add(todo);
    await db.SaveChangesAsync();

    return Results.Created($"/todoitems/{todo.Id}", todo);
});
...

在概述的其他部分,介绍了一些Special types,例如:HttpContextHttpRequestHttpResponse、...,似乎它们是作为参数注入路由方法 (Get, Post, ...);所以所有这些参数都可用:

app.MapPost("/test", (HttpContext context, HttpRequest request, HttpResponse response) => "Hello world!");

我的问题是:这里还有哪些其他参数可用:

app.MapPost("/test", (**HERE???**) => "Hello World!") {};

Route handlers are methods that execute when the route matches. Route handlers can be a function or any shape, including synchronous or asynchronous. Route handlers can be a lambda expression, a local function, an instance method or a static method.

这是来自文档

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0#request-handling.

这里有个例子
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0#request-handling

这里还有一个 lambda 中的存储库示例
https://dev.to/moe23/getting-started-with-minimal-apis-in-net-6-4mi4

另一个使用 Func
https://medium.com/executeautomation/understanding-and-working-with-asp-net-core-6-0-minimal-api-1d25fd9ecc95

来自文档 parameter binding 有下一个支持的绑定源:

  • 路由值
  • 查询字符串
  • Header
  • Body(如JSON)
  • 依赖注入提供的服务
  • 自定义

接下来 special types(如您所述):

  • HttpContext : 包含当前 HTTP 请求或响应的所有信息的上下文。
  • HttpRequest : HTTP 请求
  • HttpResponse:HTTP 响应
  • System.Threading.CancellationToken : 与当前 http 请求关联的取消令牌。
  • System.Security.Claims.ClaimsPrincipal :与请求关联的用户 (HttpContext.User)。

你也可以在这里使用类型实现 custom binding methods:

  • TryParse(为路由、查询和 header 绑定源绑定自定义类型)
public static bool TryParse(string value, T out result);
public static bool TryParse(string value, IFormatProvider provider, T out result);
  • BindAsync
public static ValueTask<T?> BindAsync(HttpContext context, ParameterInfo parameter);
public static ValueTask<T?> BindAsync(HttpContext context);

所以基本上你可以有任何可以通过 DI 解析的参数(比如示例中的 TodoDb db)或者是特殊类型(HttpContext ...)或者可以绑定在一些方式(来自请求数据(例如示例中的 Todo todo 将从 json 请求 body 绑定)或通过一些自定义魔法)。