为什么报错了还能继续往后执行
可以试试先调用request.EnableBuffering()
因为重新执行调试再拉了一下
这个启用缓冲有什么说法吗
@佩琪·NET: 这个是把请求内容读取到内存,这样才能重复读取这个请求。如果没有这个,使用后就会在流中移除或者释放
@复制粘贴机器人: 好的,我试试
尝试了 request.EnableBuffering() 没效果
@佩琪·NET: 还是会报NotSupportedException么
@复制粘贴机器人: 嗯,按道理说应该不会,就很奇怪
@佩琪·NET: 你的EnableBuffering
放在哪了
@复制粘贴机器人: 现在换了个方法,好像是拦截器没取到request.body
@佩琪·NET: 你是不是还有些自定义的中间件?
你需要在中间件的next()之前调用EnableBuffering
没有的话,则通过
app.Use(async (context, next) =>
{
context.Request.EnableBuffering();
await next();
});
@复制粘贴机器人: 没有中间件,需要用到中间件吗
@佩琪·NET:
试试这段代码
app.Use(async (context, next) =>
{
context.Request.EnableBuffering();
await next();
});
@佩琪·NET: 我的推测是,中间件中会消耗掉这个请求体流。中间件的执行顺序是在Endpoint之前的
https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-7.0#middleware-order
ActionFilter中再去EnableBuffering
已经晚了
@复制粘贴机器人: 可是我并没有用到中间件呢
@复制粘贴机器人: 我还有个问题,像您说,如果被中间件消耗了请求流信息的话,那其他数据是不是应该也获取不到呢
@佩琪·NET:
这就是我不确定的点了,可能是自带的中间件消耗了,也可能是EndPoint中 在ActionFilter之前的操作消耗了
@佩琪·NET: 只是请求体流数据被消耗了,但是后面比如Model Binding会把流中的数据取出来。后面我们用到的都不是流,想用流时就是现在你遇到的异常
@复制粘贴机器人:
@佩琪·NET:
我测试了下我的猜想
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressInferBindingSourcesForParameters = true;
});
先通过这段代码,让框架不再自动绑定模型
然后移除中间件里的EnableBuffering
,在ActionFilter中读取Request.Body
,成功了。
那么应该是在模型绑定的时候,请求体流被消耗了,上面我发的图里,ModelBinding是EndPoint的第2步,EndPoint又是中间件的最后一步。
所以EnableBuffering
只能加在自定义中间件里
@复制粘贴机器人: 但是有个关键的问题,我没有使用自定义中间件。。。
@佩琪·NET:
app.Use(async (context, next) =>
{
context.Request.EnableBuffering();
await next();
});
用这段代码就行,这就是个简易的中间件
@复制粘贴机器人: 那我试试
@复制粘贴机器人: 感谢
@佩琪·NET: 成功了?
@复制粘贴机器人: 没有,还没试呢
@复制粘贴机器人: 最近事情多一直没来及测试,来补结果了大佬,如同你的猜想,加了您上面这段代码后能成功取到post请求
@佩琪·NET: (๑•̀ㅂ•́)و✧
https://markb.uk/asp-net-core-read-raw-request-body-as-string.html
@复制粘贴机器人: (๑•̀ㅂ•́)و✧ (๑•̀ㅂ•́)و✧ (๑•̀ㅂ•́)و✧
HttpContext 上下文信息应该获取错误了,需要你提供一下GetBodyForm的调用代码
GetBodyForm() 就是个扩展方法,直接http.GetBodyForm() 调用
@佩琪·NET: 你前面的获取IP的正常吗?
@马永猛: 除了post这个,其他都能正常获取
@佩琪·NET: 解决了吗?如果没有解决建议把你的程序写个单独的小Demo然后走一下,如果有问题方便提供给我们一块给你提供解决方案,如果没有问题,那正式程序应该是流信息传输过程中有更改。
@马永猛: 暂时还没有,上面的大佬提供了一个方案,我一会再试下,有任何进展或阻塞我再和您们沟通,多谢关心