【问题标题】:Reading Request body in .net core 3.1在 .net core 3.1 中读取请求正文
【发布时间】:2021-03-13 20:46:15
【问题描述】:

我正在尝试读取 ActionFilter 中的请求正文,但出现了一些奇怪的错误。

到目前为止我尝试了什么:

  1. 将请求正文复制到内存流
context.HttpContext.Request.Body.CopyTo(memoryStream) 

抛出仅支持异步操作的错误。

  1. 将请求正文异步复制到内存流
context.HttpContext.Request.Body.CopyToAsync(memoryStream).Wait()

复制 0 个字节

  1. 使用 BodyReader:
context.HttpContext.Request.BodyReader.AsStream(true).CopyToAsync(requestBody).Wait();

throws ArgumentOutOfRange exception '指定的参数超出了有效值的范围。 (参数'start')'

我正在使用 .net core 3.1

【问题讨论】:

标签: .net-core-3.1


【解决方案1】:

我必须将我的代码转换为能够处理 Body 流的 MiddleWare:

  1. Middleware 捕获请求并将其投入使用。
  2. 操作过滤器访问服务并决定如何处理它。

这是中间件的代码

public class RequestReaderMiddleWare
{
    private readonly RequestDelegate _next;


    public RequestReaderMiddleWare(RequestDelegate next)
    {
        _next = next;
    }


    public virtual async Task Invoke(HttpContext context)
    {
        //replace and revert original request stream
        var requestBodyStream = new MemoryStream();
        var originalRequestBody = context.Request.Body;

        await context.Request.Body.CopyToAsync(requestBodyStream);
        requestBodyStream.Seek(0, SeekOrigin.Begin);

        var bodyContentService = context.RequestServices.GetService(typeof(BodyContentService))
            as BodyContentService;
        bodyContentService.Body = requestBodyStream.ToArray();
        
        requestBodyStream.Seek(0, SeekOrigin.Begin);
        context.Request.Body = requestBodyStream;

        await _next(context);

        context.Request.Body = originalRequestBody; //restore request body
    }
}

PS:需要在启动时注册:

app.UseMiddleware<RequestReaderMiddleWare>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2020-05-20
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多