【发布时间】:2009-11-05 09:20:45
【问题描述】:
我正在编写一个 asp.net 应用程序。 当用户查看页面 XXX.aspx 时,会对提供数据和业务逻辑的后端应用程序进行大量调用。我有一个来自后端应用程序的 API,我用它来调用方法来执行业务逻辑和获取数据。
我的问题如下: 如果用户反复按 F5(甚至只是按住它),那么多个 Web 请求将同时执行。这再次迫使我打开几个到后端应用程序的连接。打开连接的成本很高,因此我实现了一种缓存机制,以便用户会话获得一个连接并坚持该连接,直到它在大约 15 秒后返回到连接池。如果我激活缓存机制,当我快速按下 F5 时,与后端应用程序的连接会崩溃。发生这种情况是因为所有请求都是同时处理的,因此尝试同时使用相同的连接。这不是“合法的”。够了:) 我添加了一个睡眠功能,这样一个连接在任何时候都只会被一个请求使用。但这又很慢,如果我按 F5 20 次,我将不得不等待大约 15-20 秒,然后才会显示“最后”响应。我不想处理所有这些请求。我曾尝试在网络上的其他 asp.net 应用程序中按住 F5,但我注意到有些有这个问题,有些则没有。
这一定是一个很常见的问题,但我找不到任何关于此的好信息。 asp.net 中是否有任何设置会在最新之前取消所有请求,还是我必须为此实施自己的系统? 有没有针对这种情况的最佳做法?
提供一个更常见的有效示例: 假设一个页面请求对一个 sql server 做了 5 次选择,一个用户以 20 次超快的速度点击 F5。执行 5*20 选择是我想要避免的,可能会执行 10 次选择,因为像这样按 F5 需要一些时间,但是一旦有请求的建立,只有最后一个应该被执行。
提前致谢!
更新/附加信息:
- “不能”缓存内容。同样默认情况下,任何缓存都/应该在后端系统中完成,从而使分布式缓存成为可能,并使缓存对运行在后端系统之上的其他应用程序可用。
- 每个会话都有自己的后端连接。
- 页面“快”,加载速度为 750-1000 毫秒。 (但我按 F5 的速度要快得多……)
如果没有出现更好的解决方案,我将在会话对象或类似对象中创建一个版本号。在对后端进行任何调用之前,都会将当前请求版本号与会话中的版本号进行比较。只有匹配最新版本号的请求才会被执行。对于我的 ajax 页面,将跳过此检查,以便可以进行并发 ajax 调用。 也可能我会在 asp.net 中使用某种非常短暂的缓存,但它打开了一个全新的问题世界。毕竟这是一个很少发生的问题,而且由于我将 asp.net 解决方案设计为或多或少是无状态的,因此不可能完全禁止。但是如果有 2 个甚至更多的 Web 服务器,“版本”系统仍然会受益。
到目前为止,感谢您提出好的建议和有趣的意见!
【问题讨论】: