1

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

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

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

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

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

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

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

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

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

2 回答 2

3

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

  • 路由值
  • 请求参数
  • 标题
  • 正文(作为 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);
  • BindAsync
public static ValueTask<T?> BindAsync(HttpContext context, ParameterInfo parameter);
public static ValueTask<T?> BindAsync(HttpContext context);

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

于 2022-01-01T17:36:55.070 回答
0

路由处理程序是在路由匹配时执行的方法。路由处理程序可以是函数或任何形状,包括同步或异步。路由处理程序可以是 lambda 表达式、本地函数、实例方法或静态方法。

这来自文档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

于 2022-01-01T15:50:20.757 回答