繁体   English   中英

来自.Net Core 3.0的请求正文为空

[英]Request body from is empty in .Net Core 3.0

好的,所以我一直在绞尽脑汁,无法理解为什么完全相同的代码在.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 项目中,但如果我删除它仍然无法工作。

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

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

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

我实际上想通了,在控制器方法中,我使用[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] ,它应该可以正常工作。

这是另一个有帮助的解决方案

写一个中间件

public class EnableRequestBodyBufferingMiddleware
        {
            private readonly RequestDelegate _next;

            public EnableRequestBodyBufferingMiddleware(RequestDelegate next) =>
                _next = next;

            public async Task InvokeAsync(HttpContext context)
            {
                context.Request.EnableBuffering();

                await _next(context);
            }
        }

然后配置这个中间件

app.UseMiddleware<EnableRequestBodyBufferingMiddleware>();

现在您可以轻松准备好身体,没有任何问题

        Request.EnableBuffering();
        Request.Body.Seek(0, SeekOrigin.Begin);
        using (StreamReader stream = new StreamReader(Request.Body))
        {
            string body = await stream.ReadToEndAsync();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM