我正在尝试读取ActionFilter中的请求正文,但出现了一些奇怪的错误。
到目前为止我尝试了什么:
- 正在将请求正文复制到内存流
context.HttpContext.Request.Body.CopyTo(memoryStream)
抛出一个仅支持异步操作的错误。
- 将请求正文异步复制到内存流
context.HttpContext.Request.Body.CopyToAsync(memoryStream).Wait()
复制0字节
- 使用BodyReader:
context.HttpContext.Request.BodyReader.AsStream(true).CopyToAsync(requestBody).Wait();
throws ArgumentOutOfRange异常"指定的参数超出了有效值的范围。(参数"start"(">
我正在使用.net core 3.1
我不得不将我的代码转换为能够处理Body stream:的MiddleWare
- MIddleware ccaptures请求并将其投入服务
- 操作筛选器访问服务并决定如何处理它
这是中间件的代码
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>();