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,例如:HttpContext
、HttpRequest
、HttpResponse
、...,似乎它们是作为参数注入路由方法 (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.
这是来自文档
这里还有一个 lambda 中的存储库示例
https://dev.to/moe23/getting-started-with-minimal-apis-in-net-6-4mi4
来自文档 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 绑定)或通过一些自定义魔法)。
我是 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,例如:HttpContext
、HttpRequest
、HttpResponse
、...,似乎它们是作为参数注入路由方法 (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.
这是来自文档
这里还有一个 lambda 中的存储库示例
https://dev.to/moe23/getting-started-with-minimal-apis-in-net-6-4mi4
来自文档 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 绑定)或通过一些自定义魔法)。