众所周知,Http是无状态的,每次请求结束后,客户端都会和服务器端断开连接。请求总是从客户端发起的,除非客户端发起请求,否则服务器端没有办法主动地向客户端传递任何数据。然而对于MIS,常常需要从服务器端推送数据给客户端,例如当用户提交了一个新的申请后,需要管理员去审批。解决办法就是客户端“锲而不舍”的询问服务器,是否有新的事情要做,也就是所谓轮询技术。
轮询的过程可以用下面这个图来描述:
我们仍然以用户登录为例,先来看轮询的过程:
- 每一次用户成功登陆后,服务器端都会向客户端颁发一个身份令牌,这个令牌是一个GUID。
- 客户端每一分钟向服务器端发起一次请求,报告当前用户登陆令牌。
- 服务器取得该令牌后,验证用户登录信息,如果用户登录信息有效,则更新用户最后活动时间,然后返回用户当前登录有效的信息,否则返回错误。
- 客户端解析登陆信息。
- 如果令牌失效,例如用户被管理员锁定或删除等,则报告登陆失效,跳转登陆界面。否则什么都不做。
这样就能实现:
- 任何用户信息的改变都会及时体现,例如该用户接收到新的系统短消息,则下次客户端轮询时会有报告。
- 管理员人员可以管理用户登陆状态,较准确的查看当前登录用户或者踢出用户等。
实际上,轮询根本目的是使服务器端可以更准确的了解客户端状态,也有机会告诉客户端要做些什么,这模拟了一个双向请求的链接。
使用ExtJs实现轮询是非常用容易的,内置的Ext.TaskMgr封装了setInterval,clearInterval等方法,例如上面的轮询可以用下面的代码来实现:
1: Srims._activeTask = {
2: run: function(){
3: var token = Srims.currentLoginLog.token;
4: if (token == undefined)
5: Srims.currentLoginLog.token = Cookies.getToken();
6: Ext.Ajax.request({
7: url: '/User.asmx/Active',
8: success: Srims._onActive,
9: method: 'POST'
10: });
11:
12: },
13: interval: 1000 * 60
14: }
15: Ext.TaskMgr.start(Srims._activeTask);
详细说明可以参考ExtJs文档中Ext.TaskMgr和Ext.util.TaskRunner这两个类。
分类:
Web Develop
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2006-12-21 常用的数据访问方式