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

wik*_*iki 7 c# asp.net-core .net-6.0 minimal-apis

我是 ASP.NET Core 6.0 中提供的 Minimal API 的新手,根据 Microsoft 的教程(此处此处),可以为 Get 方法定义一个示例路由,如下所示:

app.MapGet("/", () => "Hello World!");
Run Code Online (Sandbox Code Playgroud)

对于Post方法,提供了以下代码:

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

    return Results.Created($"/todoitems/{todo.Id}", todo);
});
...
Run Code Online (Sandbox Code Playgroud)

在概述的其他部分中,介绍了一些特殊类型,例如:HttpContext, HttpRequest, HttpResponse, ... ,并且它们似乎作为参数注入到路由方法(Get,Post,...);所以所有这些参数都可用:

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

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

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

Gur*_*ron 9

从文档中参数绑定有下一个支持的绑定源:

  • 路线值
  • 请求参数
  • 标头
  • 正文(JSON 形式)
  • 依赖注入提供的服务
  • 风俗

下一个特殊类型(正如您提到的):

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

您也可以使用此处的类型来实现自定义绑定方法

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

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