.NET 6中读取BODY内容

发布时间:2022-03-04 16:13:14来源:本站阅读(635)

    我的目的很简单,就是在Filter中读取数据记录请求日志。

    先看.NET CORE 3.1的代码

    var requestData = context.HttpContext.Request.Body;
    requestData.Position = 0;
    string rawRequest=string.Empty;
    using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8, true, 1024, true))
    {
        rawRequest = reader.ReadToEndAsync().Result;
    }

    以上代码在.NET CORE 3.1正常使用,但在.NET 6中就不好使了。

    经过搜索解决,但原因暂时没搞明白。

    上代码

    在Program中加

    app.Use(async (context, next) =>
    {
        var requestBodyStream = new MemoryStream();
        await context.Request.Body.CopyToAsync(requestBodyStream);
    
        requestBodyStream.Seek(0, SeekOrigin.Begin);
    
        string body = await new StreamReader(requestBodyStream).ReadToEndAsync();
        context.Items["body"] = body;
        requestBodyStream.Seek(0, SeekOrigin.Begin);
        context.Request.Body = requestBodyStream;
    
        await next();
    });

    然后在Filer中读取

    var requestData = context.HttpContext.Items.TryGetValue("body",out object body);

    body就是我想要的。

    难道 .NET 6 执行顺序有变?有空再看吧,先记录。

关键字body