Session导致Action不异步
啊。回想起来,真是一个大坑啊,最近博主在做一个上传文件实时显示进度条的功能。博主的思路是在上传的时候用一个Task一秒一次向Redis中插入当前的上传进度 ,上传视频后再轮询上传进度实时显示在客户端。
然后我就开始敲代码了,一起看起来都没什么问题。运行的时候一下就懵比了,发现轮询的请求要等到上传的请求返回才可以进入到action中。也就是说我的请求不是异步的了。变成了同步 what??
后来经过一系列排查,原来是session的问题,因为我存了当前的登陆状态,当cookie中用同一个sessionId去请求后台的时候,是lock住的,必须上一个请求返回后才可以下一个请求才会进来,这简直就是在搞事,假如某个action的执行过程特别长,其它的请求只能排在后面,这无疑是特别影响性能的。
那么为什么会是这种设计呢?因为微软希望session是线程安全的,不会有两个线程同时对session内的数据进行修改的情况
那我的进度条功能就不能实现了? 当然不是,微软贴心的为我们留出了选择,我们可以在controller中加注解[SessionState(SessionStateBehavior.ReadOnly)] 也是说,哎呀,老哥,放心吧,我不瞎整,保证这个controller只读session不进行修改,你就让我的小伙伴一起来玩耍吧。这时我们又可以愉快的继续下去了。有人会问了,那我贴了这个注解,但是我又修改了session呢,遗憾的说,老哥控制的还是很严格的,当你做了保证后,你对session的所有修改都是无效的。(Ps:其实另有方法哦)
SessionStateBehavior还有其它的选项
Default
Disabled
Required