正在读取.net核心3.1中的请求正文



我正在尝试读取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异常"指定的参数超出了有效值的范围。(参数"start"(">

我正在使用.net core 3.1

我不得不将我的代码转换为能够处理Body stream:的MiddleWare

  1. MIddleware ccaptures请求并将其投入服务
  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>();

最新更新