首页 新闻 搜索 专区 学院

asp.net core 部署到IIS下接收产生 Cannot access a closed Stream 错误。

0
悬赏园豆:20 [已解决问题] 解决于 2020-12-15 11:49

错误描述:asp.net core api 应用独立运行,本地调试时均无异常,但部署到IIS下时,登录接收频繁报 Cannot access a closed Stream 错误。

特殊情况:
1、接口部署在 iis 时是部署在名为 WebApi 的虚拟目录内的(历史依赖原因)。
2、目录只发现登录接口在报这个错,登录接口和其他接口的区别是登录接口上有 AllowAnonymous 标记,登录接口的代码见下图。

环境版本:
.net 5.0,.net core3.1都有这个情况,更早的2.x未发现过,从2.x到3.x到5.0登录接口代码无改动,框架层面定制各种拦截器、格式化、异常处理均无变化。

问题补充:

猜测就是iis转发造成的,我用nginx本地测试转发,也没发现这个错误

Adming的主页 Adming | 初学一级 | 园豆:21
提问于:2020-11-25 11:12
< >
分享
最佳答案
0

找到原因了
原来:站点监控时post请求头设置为 Content-Type: application/json 引起的。
设置为 Content-Type: application/json-patch+json 后错误消失。

引发另一个问题,web前端程序配置的一直都是 Content-Type: application/json; ,从来没有引起过这个异常。
但用 Swagger UI自带的接口测试时选 application/json 也会触发错误(默认是选中application/json-patch+json的)

Adming | 初学一级 |园豆:21 | 2020-11-26 09:30
其他回答(1)
0

有没有使用自己实现的 middleware ?

收获园豆:20
dudu | 园豆:38156 (高人七级) | 2020-11-25 11:19

有可能是请求到达 Post action 之前,Request.Body 被读取了

支持(0) 反对(0) dudu | 园豆:38156 (高人七级) | 2020-11-25 11:21

没有,异常发生在 body modelbind阶段,接口用的是框架默认的,在请求处理到这之前没有什么自定义的拦截器之类的东西,也就是说,完成没有走到自已的代码阶段。

支持(0) 反对(0) Adming | 园豆:21 (初学一级) | 2020-11-25 11:22

@dudu: 是的,先前遇到过这种情况,是因为我自已处理权限验证时自已读取过。但这个登录接口不用处理权限验证。

支持(0) 反对(0) Adming | 园豆:21 (初学一级) | 2020-11-25 11:24

@Adming: 最好能提供 Startup 中的相关代码

支持(0) 反对(0) dudu | 园豆:38156 (高人七级) | 2020-11-25 11:27

@dudu:

支持(0) 反对(0) Adming | 园豆:21 (初学一级) | 2020-11-25 11:32

@dudu: 没有自定义的 middleware

支持(0) 反对(0) Adming | 园豆:21 (初学一级) | 2020-11-25 11:35

@Adming: 没有 middleware ,但有 filter ,建议检查一下 filter 部分的代码

支持(0) 反对(0) dudu | 园豆:38156 (高人七级) | 2020-11-25 11:49

@dudu: 你看我上面的代码,2个filter和一个OutputFormatters,OutputFormatters是返回时才会用到,ExceptionHandleFilter 只有在程序内上生异常时统一格式化输出和记录日志,InputValidAndResultHandleFilter 只处理 ModelState.IsValid 未验证成功时进行统一格式化返回。
这些都没有读取post body的操作。
历史原因,代码是一路升级过来的,需要兼容, 权限检查都是在action内部处理的(用的系统自带的 Authorize验证是否登录)。
另外,代码问题,调试和独立运行时也应该会有错误才对。
我猜测就是iis转发造成的,可能和iis的问题,也可能是虚拟目录的原因。
我先进行进一步的验证(也可能不验证了,因为本身我api就可以独立运行了,不非得绑定到iis上,借口也有了)

支持(0) 反对(0) Adming | 园豆:21 (初学一级) | 2020-11-25 12:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册