我刚刚发现ASP中的每个请求.Net web应用程序在请求开始时获得会话锁,然后在请求结束时释放它!
如果你没有意识到这一点,就像一开始对我一样,这基本上意味着:
任何时候都可以使用ASP.Net网页需要很长时间才能加载(可能是因为数据库调用缓慢或其他原因),用户决定导航到其他页面,因为他们厌倦了等待,他们不能!ASP.Net会话锁强制新页面请求等待,直到原始请求完成其缓慢得令人痛苦的加载.啊.
每当UpdatePanel加载缓慢,并且用户决定在UpdatePanel完成更新之前导航到其他页面时...他们不能!ASP.net会话锁强制新页面请求等待,直到原始请求完成其缓慢得令人痛苦的加载.加倍啊!
那么有什么 Select 呢?到目前为止,我已经想出了:
- 实现ASP.NET支持的自定义SessionStateDataStore.我没有发现太多要复制的东西,而且看起来风险很高,很容易搞砸.
- 跟踪所有正在进行的请求,如果请求来自同一用户,请取消原始请求.看起来有点极端,但它会起作用(我认为).
- 不要使用会话!当我需要用户的某种状态时,我可以使用缓存,以及经过身份验证的用户名上的关键项,或者类似的东西.似乎又有点极端了.
我真不敢相信ASP.NET微软团队会在4.0版的框架中留下如此巨大的性能瓶颈!我是不是漏掉了什么明显的东西?为会话使用ThreadSafe集合有多难?