"no body provided" POST 到最小端点时的响应



我正在尝试将一些简单的控制器方法转换为在asp.net core 6的最新RC上使用端点路由。控制器工作正常,它看起来像这样:

[HttpPost]
public async Task<IActionResult> CreateUser(NewUserRequest newUser)
{
/* do stuff with newUser */
/* return CreatedAtRoute(...); */
}

我已经尝试转换到使用IEndpointRouteBuilder,像这样:

endpoints.MapPost("/api/user/test",
(NewUserRequest request) =>
{
/* same thing as controller method */
});
// prints error to the log:
// Implicit body inferred for parameter "request" but no body was provided. Did you mean to use a Service instead?

我使用完全相同的测试请求(通过邮差,通常),所以我知道这不是客户的问题。更重要的是,如果我只接受一个HttpRequest参数,我可以将主体读入json blob。

endpoints.MapPost("api/user/test2",
async (HttpRequest request) =>
{
using (var sr = new StreamReader(request.BodyReader.AsStream()))
{
var body = await sr.ReadToEndAsync();
/* body is valid json here */
}
});

我在这里真的很困惑,特别是因为它在某些情况下可以工作,但当我将类型绑定到最小端点之一时就不行了。

您使用的语法在ASP中首次引入的Minimal api中可用。. NET Core 6预览版那时还不可能绑定到特定的对象。它与ASP中添加的端点路由无关。. NET Core 3.1.

如果你创建一个新的"empty"web应用程序与dotnet new web你得到:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

这是通过新的WebApplication类使用端点路由。要添加POST端点,您可以使用:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.MapPost("/api/user/test",(NewUserRequest request) =>
{
Console.WriteLine(request.Name);
return request;
/* same thing as controller method */
});
app.Run();
class NewUserRequest
{
public string Name{get;set;}
}

附加的类和方法必须在文件末尾定义。

curl测试:

curl -X POST https://localhost:7153/api/user/test -d '{ "Name":"A"}' -H 'Content-Type: application/json' -v

在服务控制台记录A并返回

{"name":"A"}%

向客户机。

出现这个错误的原因:

参数"request"但没有提供尸体。你的意思是用服务代替吗?

是在ASP。. NET Core 6 Preview 6可以不使用[FromServices]属性注入服务。在下面的代码中,注入了DbContext:

app.MapGet("/todos", async (TodoDbContext db) =>
{
return await db.Todos.ToListAsync();
});

最新更新