【问题标题】:Request body from is empty in .Net Core 3.0.Net Core 3.0 中的请求正文为空
【发布时间】:2020-08-12 19:55:11
【问题描述】:

好吧,所以我一直在绞尽脑汁,终生无法理解为什么完全相同的代码在 .Net Core 2.2 中完美运行,但在 .Net Core 3.0 中返回一个空字符串。

我正在运行的代码是这样的:

public static async Task<string> GetRequestBodyAsync(this HttpRequest request,
                                                     Encoding encoding = null)
{
    if (encoding == null) encoding = Encoding.UTF8;
    var body = "";

    request.EnableBuffering();
    if (request.ContentLength == null || !(request.ContentLength > 0) || !request.Body.CanSeek) return body;

    request.Body.Seek(0, SeekOrigin.Begin);
    using (var reader = new StreamReader(request.Body, encoding, true, 1024, true))
        body = await reader.ReadToEndAsync();

    request.Body.Position = 0;
    return body;
}

我这样称呼这个扩展:

var bodyContent = await Request.GetRequestBodyAsync();
var body = new MemoryStream(Encoding.UTF8.GetBytes(bodyContent));

在 .Net Core 2.2 中,我得到了我想要的已发送负载的正文,但在 .Net Core 3.0 中,我得到了一个空字符串。

我在启动时使用扩展程序将 Newtonsoft 添加到我的 .Net Core 3.0 项目中,但如果我删除它仍然无法工作。

任何想法我可能做错了什么?

【问题讨论】:

  • 似乎您的函数正在返回中间的那个 if 语句。尝试单步执行代码或在整个过程中添加一些日志语句,以确定哪个条件失败以及是否达到了 body = await reader.ReadToEndAsync(); 行。
  • 条件if (request.ContentLength == null || !(request.ContentLength &gt; 0) || !request.Body.CanSeek)中的值是什么
  • @Klaycon await reader.ReadToEndAsync(); 已到达并到达最后一行但仍返回 "";
  • @Train ContentLength 在这种情况下是 243 CanSeek 是真的。

标签: c# .net-core .net-core-3.0


【解决方案1】:

在启动类中添加这个中间件:

app.Use((context, next) =>
{
    context.Request.EnableBuffering();
    return next();
});

【讨论】:

  • Gid - 感谢您发布可能的解决方案!您能否提供一些背景信息来说明为什么这会有所帮助?如果它解决了这个问题,那么有一些背景会很好。我假设您指的是 startup.cs 文件中的 ConfigureServices 方法。
  • 通常Request.Body不支持倒带,所以只能读取一次。此解决方案可以通过设置 Request.Body.Position = 0 来多次读取 Request.Body;并使用流阅读器。示例devblogs.microsoft.com/aspnet/…
【解决方案2】:

实际上我想通了,在控制器方法中,我使用 [FromBody] 读取正文,因此正文被读取两次而不是第一次倒带。

public async Task<ActionResult<string>> PaymentRequestCallbackAsync(/*[FromBody] SecretModel model*/)
{
    var body = await Request.GetRequestBodyAsync();
    var stream = new MemoryStream(Encoding.UTF8.GetBytes(body));
    return body;
}

所以删除[FromBody],它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2021-03-13
    • 1970-01-01
    • 2021-04-13
    • 2019-06-26
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多