ASP.NET Core 6.0 - Minimal APIs: 处理路由的 Map 方法有哪些可用参数?

7

我是新手,接触到了 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);
});
...

在概述的其他部分中,介绍了一些特殊类型(如:HttpContextHttpRequestHttpResponse等),它们似乎被作为参数注入到路由方法(Get、Post等)中;所以所有这些参数都是可用的:
app.MapPost("/test", (HttpContext context, HttpRequest request, HttpResponse response) => "Hello world!");

我的问题是:这里还有哪些可用的参数?
app.MapPost("/test", (**HERE???**) => "Hello World!") {};

1
不明白为什么在我的Asp.Net Core 6应用程序中,为什么所有这些Map*方法都无法解析?只有一个广泛的Map方法。 - anatol
谢谢您提出这个问题。 - Ram Fattah
2个回答

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);
  • BindAsync
public static ValueTask<T?> BindAsync(HttpContext context, ParameterInfo parameter);
public static ValueTask<T?> BindAsync(HttpContext context);

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

如何在没有使用 System.Web.Http 的情况下获取客户端的 IP 地址和 UserAgent? - Kiquenet
@Kiquenet:
app.MapGet("/callingip", (HttpRequest request) => { return request.HttpContext.Request.Headers.UserAgent.ToString() + System.Environment.NewLine + request.HttpContext.Connection.RemoteIpAddress.ToString(); });
- Lucky Lindy

1
路由处理程序是在路由匹配时执行的方法。路由处理程序可以是函数或任何形状,包括同步或异步。路由处理程序可以是 lambda 表达式、本地函数、实例方法或静态方法。
这段话来自https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0#request-handling的文档。
这里有一个例子:https://learn.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接