在 ASP.NET Core 中,ActionFilterAttribute 是用于在执行操作前后运行代码的特性。然而,发现使用这个特性时,HttpContext.Request.Body 始终为空。这是因为默认情况下,RequestBodyStream 处于消耗模式,当请求进入控制器时,该流已被读取并关闭。因此,无法再次读取该流。
要解决这个问题,可以使用 EnableBuffering 方法将流缓冲区启用。这样,即使流已被读取,你仍然可以再次读取它。
下面是一个简单的代码示例:
public class SampleFilter : ActionFilterAttribute
{
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
context.HttpContext.Request.EnableBuffering();
using (var reader = new StreamReader(
context.HttpContext.Request.Body,
encoding: Encoding.UTF8,
detectEncodingFromByteOrderMarks: false,
bufferSize: 1024,
leaveOpen: true))
{
var body = await reader.ReadToEndAsync();
// Do something with the body...
// Reset the request body stream position so the next middleware can read it
context.HttpContext.Request.Body.Position = 0;
}
await next();
}
}
在示例代码中,首先通过调用 EnableBuffering() 方法启用缓冲区。然后,使用 StreamReader 从请求正文中读取 body,并进行一些操作。最后,将请求正文流的位置重置为 0,以便下一个中间件可以读取它。