WPF应用程序如何杜绝骚操作

货郎大叔 2020-08-24 08:15:50
一个WPF应用程序,一个TabControl,有几个TabItem,切换TabItem的时候,都会访问云数据库,以显示数据。为了防止用户恶意点击,给服务器造成压力,一般采取什么方式来杜绝?
...全文
345 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2020-08-24
  • 打赏
  • 举报
回复
同样的道理,逻辑弄清楚了 技术上使用限流,连续操作不理,只把动作存着。你稳定不动了,在拿最后一个。(比如我可以用rx.timeout 和last做)
lich2005 2020-08-24
  • 打赏
  • 举报
回复
尽量利用缓存设计来应对这种密集操作,也就是一些数据可以先下到客户端,客户端本地去读取。有需要点一下刷新之类的按钮再去服务器上读取。实际上数据库查询的时候也会有缓存查询,如果数据库性能不差的话,应该能应付这种情况的。
wanghui0380 2020-08-24
  • 打赏
  • 举报
回复
so,逻辑弄清楚了,技巧上其实无所谓。 这里你用mutex互斥也一的效果
晨易夕 2020-08-24
  • 打赏
  • 举报
回复
是的,这种需求与WPF没有技术上的联系。 就比如拿前端的防抖(debouncing)和节流(throttling)来说,优化的应用场景就十分广泛。 你这儿为了防止用户骚操作乱点增加服务器压力,可以使用防抖优化。即当用户点击切换之后,延迟一定时间后再调用后台接口,如果在这个延迟时间内用户又不断点击切换,就取消之前准备要调用接口的操作,换成调用新操作的任务。 建议先去了解下防抖(debouncing)节流(throttling)的理念。
wanghui0380 2020-08-24
  • 打赏
  • 举报
回复
伪代码 tab1load锁 async task tab1load方法() { if(tab1load锁.钥匙==0) retrun; await tab1load锁.异步使用中 tab1.加载状态=加载中 await 加载远端数据 tab1.加载状态=加载完毕 tab1load锁.归换钥匙 } 这样无论他怎么切换,前一个没执行完毕,后一个直接return出去。so,我可以让你切换UI,但我不会重复执行动作
wanghui0380 2020-08-24
  • 打赏
  • 举报
回复
问题: 1.客户会来回操作,可以不让他来回操作,放入加载模态框,不加载完毕不准下次操作 2.如果1你觉着逻辑不合理,ok,我们还是允许他切换,只是加锁。你上次访问没完成,进不了下一次的 查询锁:没钥匙直接弹框告诉客户,正在等待上次请求,有钥匙拿到钥匙 await 一次访问 归换钥匙 3.后端幂等性操作,每个操作只要条件一样,他不会影响变化。那么缓存依赖,那么还是加锁直接返回正在操作请勿重复请求(语义上是“条件一样,我直接返回缓存的结果,如果语义不一样,我执行完了回告诉你结果,但我不会重复执行动作,因为已经有了一个一模一样的条件在运行”)
蜗牛慢慢趴 2020-08-24
  • 打赏
  • 举报
回复
界面已经这样设计了,就没啥大问题吧?用户骚操作一下服务器就受不了了,建议更换服务器
datafansbj 2020-08-24
  • 打赏
  • 举报
回复
这种需求与 WPF 没有半毛钱关系。

通常情况下,为防止恶意或机器人操作,服务端对一个会话里的请求会加上判断,如果请求过于密集(频繁),可加延迟处理,或直接返回错误提示。当然也可在客户端增加这些逻辑处理。不过这种处理是双刃剑,处理不好用户体验度变差。

本质:你根据什么判断是误操作还是正常操作?如果依据本身就不准确或不严谨,那么任何处理方法都不会带来完美的结果。
八爻老骥 2020-08-24
  • 打赏
  • 举报
回复
不是实时数据的话,在程序运行时预加载。
threenewbee 2020-08-24
  • 打赏
  • 举报
回复
把调用的代码放在一个单独的类中。
每次访问,都判断下距上次访问的时间,如果<xxx 秒,不执行。
不要直接客户端连数据库,应该在服务器上部署web api,通过 web api由服务器载访问数据库

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧