当我添加请求参数时,为什么我的 Request.BodyReader 为空(ASP.NET Core 3.0)

use*_*620 5 c# async-await asp.net-core-3.0

我从 ASP.NET Core 2.2 迁移到 3.0,现在遇到了问题。如果我写这样的代码:

[HttpPost("test")]
public async Task Test(object o) {
    HttpContext.Request.EnableBuffering();
    var result = await HttpContext.Request.BodyReader.ReadAsync();
    var buffer = result.Buffer;
    Console.WriteLine(System.Text.Encoding.Default.GetString(buffer.FirstSpan));
    HttpContext.Request.BodyReader.AdvanceTo(buffer.End);
}
Run Code Online (Sandbox Code Playgroud)

我将在控制台中收到一条空消息,但如果我删除参数

[HttpPost("test")]
public async Task Test() {
    HttpContext.Request.EnableBuffering();
    var result = await HttpContext.Request.BodyReader.ReadAsync();
    var buffer = result.Buffer;
    Console.WriteLine(System.Text.Encoding.Default.GetString(buffer.FirstSpan));
    HttpContext.Request.BodyReader.AdvanceTo(buffer.End);
}
Run Code Online (Sandbox Code Playgroud)

, 我收到来自 body 的消息

curl -X POST \ http://localhost:5000/test \ -H 'Content-Type: application/json' \ -d '{ "test":123 }'

Kje*_*sen 6

我遇到了类似的问题,记录 webhook 请求主体的请求主体。

您需要首先为请求正文启用缓冲,否则,它是一个只进流,在使用时将为空(并且无法回滚)。

在Startup.cs中,将以下内容添加到Configure()方法中:

app.Use((context, next) =>
        {
            context.Request.EnableBuffering();
            return next();
        });
Run Code Online (Sandbox Code Playgroud)

我在这里找到了解决方案:https://github.com/aspnet/AspNetCore/issues/15009#issuecomment-542291956(Thratcher写的)