错误描述: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本地测试转发,也没发现这个错误
找到原因了
原来:站点监控时post请求头设置为 Content-Type: application/json 引起的。
设置为 Content-Type: application/json-patch+json 后错误消失。
引发另一个问题,web前端程序配置的一直都是 Content-Type: application/json; ,从来没有引起过这个异常。
但用 Swagger UI自带的接口测试时选 application/json 也会触发错误(默认是选中application/json-patch+json的)
有没有使用自己实现的 middleware ?
有可能是请求到达 Post
action 之前,Request.Body 被读取了
没有,异常发生在 body modelbind阶段,接口用的是框架默认的,在请求处理到这之前没有什么自定义的拦截器之类的东西,也就是说,完成没有走到自已的代码阶段。
@dudu: 是的,先前遇到过这种情况,是因为我自已处理权限验证时自已读取过。但这个登录接口不用处理权限验证。
@Adming: 最好能提供 Startup 中的相关代码
@dudu:
@dudu: 没有自定义的 middleware
@Adming: 没有 middleware ,但有 filter ,建议检查一下 filter 部分的代码
@dudu: 你看我上面的代码,2个filter和一个OutputFormatters,OutputFormatters是返回时才会用到,ExceptionHandleFilter 只有在程序内上生异常时统一格式化输出和记录日志,InputValidAndResultHandleFilter 只处理 ModelState.IsValid 未验证成功时进行统一格式化返回。
这些都没有读取post body的操作。
历史原因,代码是一路升级过来的,需要兼容, 权限检查都是在action内部处理的(用的系统自带的 Authorize验证是否登录)。
另外,代码问题,调试和独立运行时也应该会有错误才对。
我猜测就是iis转发造成的,可能和iis的问题,也可能是虚拟目录的原因。
我先进行进一步的验证(也可能不验证了,因为本身我api就可以独立运行了,不非得绑定到iis上,借口也有了)