我需要访问RequestBody在OnActionExecuting或OnActionExecuted过滤器,但我找不到具体的例子,如何使用PipeReader读取完整的请求体流和返回流的位置为零(为了通过ControllerBase读取请求参数-如果我读取body OnActionExecuting或第一次返回位置为零,如果我在OnActionExecuting中读取)。
在我的属性身上总是空的。

但是,存在API参数。

或者还有另外一种方法来接收ControllerBase的请求体?
发布于 2022-11-23 04:02:00
根据您的描述,我认为您希望在asp.net内核中多次获得请求体。但是在asp.net内核中,一旦使用了请求,就无法读取它。如果要多次读取请求正文,则需要设置:
context.Request.EnableBuffering()然后,要读取身体流,可以这样做:
string bodyContent = new StreamReader(Request.Body).ReadToEnd();在安全方面,将Request.Body.Position重置设置为0。这样,请求生命周期后面的任何代码都会找到状态中的请求体,就像它还没有被读取一样。
Request.Body.Position = 0;因此,您可以在OnActionExecuting或OnActionExecuted方法中设置此代码。
public void OnActionExecuting(ActionExecutingContext context)
{
context.HttpContext.Request.EnableBuffering();
string bodyContent = new StreamReader(context.HttpContext.Request.Body).ReadToEnd();
context.HttpContext.Request.Body.Position = 0;
}但是请注意,模型绑定发生在操作筛选器之前,因此模型绑定将首先消耗请求主体,并且无法在操作筛选器中读取它,您需要自定义模型绑定并将上述配置应用于它。
https://stackoverflow.com/questions/74498115
复制相似问题