首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用RequestBody读取PipeReader并将流的起始位置返回到零(净核6)

如何用RequestBody读取PipeReader并将流的起始位置返回到零(净核6)
EN

Stack Overflow用户
提问于 2022-11-19 06:58:00
回答 1查看 57关注 0票数 0

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

在我的属性身上总是空的。

但是,存在API参数。

或者还有另外一种方法来接收ControllerBase的请求体?

EN

回答 1

Stack Overflow用户

发布于 2022-11-23 04:02:00

根据您的描述,我认为您希望在asp.net内核中多次获得请求体。但是在asp.net内核中,一旦使用了请求,就无法读取它。如果要多次读取请求正文,则需要设置:

代码语言:javascript
复制
context.Request.EnableBuffering()

然后,要读取身体流,可以这样做:

代码语言:javascript
复制
string bodyContent = new StreamReader(Request.Body).ReadToEnd();

在安全方面,将Request.Body.Position重置设置为0。这样,请求生命周期后面的任何代码都会找到状态中的请求体,就像它还没有被读取一样。

代码语言:javascript
复制
Request.Body.Position = 0;

因此,您可以在OnActionExecutingOnActionExecuted方法中设置此代码。

代码语言:javascript
复制
public void OnActionExecuting(ActionExecutingContext context)
        {
            
            context.HttpContext.Request.EnableBuffering();
            string bodyContent = new StreamReader(context.HttpContext.Request.Body).ReadToEnd();
            context.HttpContext.Request.Body.Position = 0;
        }

但是请注意,模型绑定发生在操作筛选器之前,因此模型绑定将首先消耗请求主体,并且无法在操作筛选器中读取它,您需要自定义模型绑定并将上述配置应用于它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74498115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档