首页 新闻 会员 周边 捐助

C# 拦截器获取http post请求入参问题

0
悬赏园豆:10 [已解决问题] 解决于 2023-10-18 13:49

大佬们,这里request和request.body不为空,但是用流读取http post请求的入参始终为空,设置Body的position也报错,有大佬能看下怎么处理吗

佩琪·NET的主页 佩琪·NET | 初学一级 | 园豆:40
提问于:2023-10-07 11:17
< >
分享
最佳答案
1

为什么报错了还能继续往后执行
可以试试先调用request.EnableBuffering()

收获园豆:10
复制粘贴机器人 | 小虾三级 |园豆:720 | 2023-10-07 13:19

因为重新执行调试再拉了一下

佩琪·NET | 园豆:40 (初学一级) | 2023-10-07 13:40

这个启用缓冲有什么说法吗

佩琪·NET | 园豆:40 (初学一级) | 2023-10-07 13:45

@佩琪·NET: 这个是把请求内容读取到内存,这样才能重复读取这个请求。如果没有这个,使用后就会在流中移除或者释放

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-07 14:00

@复制粘贴机器人: 好的,我试试

佩琪·NET | 园豆:40 (初学一级) | 2023-10-07 14:02

尝试了 request.EnableBuffering() 没效果

佩琪·NET | 园豆:40 (初学一级) | 2023-10-07 15:10

@佩琪·NET: 还是会报NotSupportedException么

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-07 15:54

@复制粘贴机器人: 嗯,按道理说应该不会,就很奇怪

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 09:19

@佩琪·NET: 你的EnableBuffering放在哪了

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 09:46

@复制粘贴机器人: 现在换了个方法,好像是拦截器没取到request.body

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 11:24

@佩琪·NET: 你是不是还有些自定义的中间件?
你需要在中间件的next()之前调用EnableBuffering
没有的话,则通过

    app.Use(async (context, next) =>
    {
        context.Request.EnableBuffering();
        await next();
    });
复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 13:36

@复制粘贴机器人: 没有中间件,需要用到中间件吗

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 13:38

@佩琪·NET:
试试这段代码

    app.Use(async (context, next) =>
    {
        context.Request.EnableBuffering();
        await next();
    });
复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 13:41

@佩琪·NET: 我的推测是,中间件中会消耗掉这个请求体流。中间件的执行顺序是在Endpoint之前的
https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-7.0#middleware-order
ActionFilter中再去EnableBuffering已经晚了

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 13:43

@复制粘贴机器人: 可是我并没有用到中间件呢

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 14:22

@复制粘贴机器人: 我还有个问题,像您说,如果被中间件消耗了请求流信息的话,那其他数据是不是应该也获取不到呢

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 14:27

@佩琪·NET:
这就是我不确定的点了,可能是自带的中间件消耗了,也可能是EndPoint中 在ActionFilter之前的操作消耗了

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 14:27

@佩琪·NET: 只是请求体流数据被消耗了,但是后面比如Model Binding会把流中的数据取出来。后面我们用到的都不是流,想用流时就是现在你遇到的异常

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 14:29

@复制粘贴机器人:

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 14:43

@佩琪·NET:
我测试了下我的猜想

    builder.Services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressInferBindingSourcesForParameters = true;
    });

先通过这段代码,让框架不再自动绑定模型
然后移除中间件里的EnableBuffering,在ActionFilter中读取Request.Body,成功了。
那么应该是在模型绑定的时候,请求体流被消耗了,上面我发的图里,ModelBinding是EndPoint的第2步,EndPoint又是中间件的最后一步。
所以EnableBuffering只能加在自定义中间件里

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 15:49

@复制粘贴机器人: 但是有个关键的问题,我没有使用自定义中间件。。。

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 15:51

@佩琪·NET:

    app.Use(async (context, next) =>
    {
        context.Request.EnableBuffering();
        await next();
    });

用这段代码就行,这就是个简易的中间件

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 15:55

@复制粘贴机器人: 那我试试

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 15:55

@复制粘贴机器人: 感谢

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 15:55

@佩琪·NET: 成功了?

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-08 15:59

@复制粘贴机器人: 没有,还没试呢

佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 15:59

@复制粘贴机器人: 最近事情多一直没来及测试,来补结果了大佬,如同你的猜想,加了您上面这段代码后能成功取到post请求

佩琪·NET | 园豆:40 (初学一级) | 2023-10-18 13:40
复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-10-18 13:46

@复制粘贴机器人: (๑•̀ㅂ•́)و✧ (๑•̀ㅂ•́)و✧ (๑•̀ㅂ•́)و✧

佩琪·NET | 园豆:40 (初学一级) | 2023-10-18 13:48
其他回答(2)
0

您是想实现文件上传,后台对文件解析的功能吗

楠木大叔 | 园豆:2083 (老鸟四级) | 2023-10-07 12:41

拦截器里面想获取一下post请求的入参

支持(0) 反对(0) 佩琪·NET | 园豆:40 (初学一级) | 2023-10-07 13:41
0

HttpContext 上下文信息应该获取错误了,需要你提供一下GetBodyForm的调用代码

马永猛 | 园豆:213 (菜鸟二级) | 2023-10-08 11:31

GetBodyForm() 就是个扩展方法,直接http.GetBodyForm() 调用

支持(0) 反对(0) 佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 11:34

@佩琪·NET: 你前面的获取IP的正常吗?

支持(0) 反对(0) 马永猛 | 园豆:213 (菜鸟二级) | 2023-10-08 11:35

@马永猛: 除了post这个,其他都能正常获取

支持(0) 反对(0) 佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 11:38

@佩琪·NET: 解决了吗?如果没有解决建议把你的程序写个单独的小Demo然后走一下,如果有问题方便提供给我们一块给你提供解决方案,如果没有问题,那正式程序应该是流信息传输过程中有更改。

支持(0) 反对(0) 马永猛 | 园豆:213 (菜鸟二级) | 2023-10-08 16:42

@马永猛: 暂时还没有,上面的大佬提供了一个方案,我一会再试下,有任何进展或阻塞我再和您们沟通,多谢关心

支持(0) 反对(0) 佩琪·NET | 园豆:40 (初学一级) | 2023-10-08 16:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册