在网站上执行定时任务 - 最佳实践?

时间:2016-04-08 23:09:01

标签: c# concept

在网站(asp.net)环境中实施定时任务的最佳方法是什么? 单击按钮可将其锁定4小时或一天。我将如何实施计算4小时(或1天)然后解锁按钮的过程?

请记住,这是一个网站:我是

  1. 将当前日期时间戳保存到数据库(我以网站注册用户身份登录)
  2. 每次我使用按钮访问页面时,我都会检索戳记和持续时间
  3. 并计算我必须等待多长时间,直到按钮被解锁。
  4. (并且可能实现一个JS(例如)倒数计数器,该计数器将显示在按钮附近)

    我认为使用会话变量或cookie是一个坏主意,因为我可能会关闭我的网站或删除我的用户数据,因而无法解决上述问题。

4 个答案:

答案 0 :(得分:3)

由于您的要求是跨会话支持这一点,因此它肯定需要在数据库中。

DB

添加LockedUntilUtc列,指示按钮应解锁的日期/时间。更好的是,将列命名为业务模型。也许你正在编写一个人力资源应用程序,有一个加薪审批流程,并且在经理可以释放加薪以允许人力资源部门审核之前有一个强制性的7天等待期,并且按钮是“发布提升”,在这种情况下我是'将其命名为PublishRaiseAvailableUtc

我已经处理了很多这样的场景,并且使用事件需要发生的日期/时间通常更简单。与保存计时器的开头相反,每次需要进行计算时总是需要增加7天。

UI

将此值作为隐藏值向下发送。使用您选择的框架编写javascript,或者只是像setTimeout那样简单的东西,它会在那个时间点解锁按钮。

不要担心尝试采用一种复杂的方法来阻止用户通过操纵HTML来解锁按钮。您应该假设他们可以解锁按钮,如果他们付出努力。鉴于这种假设,我们需要服务器端逻辑来验证请求。

服务器后验证

当用户单击按钮并将POST发送到服务器时,服务器端代码应从数据库中检索PublishRaiseAvailableUtc的值(不要信任从隐藏字段发布的值),并将其与服务器时间进行比较。即服务器时间应该大于PublishRaiseAvailableUtc,假设您确保比较UTC时间。

答案 1 :(得分:1)

我认为最好的办法是节省按钮再次解锁的那一天。每次加载页面时,都要从数据库中检索该信息,以检查它是否应该被锁定。

另一种可能的方法是使用应用程序变量。但我不建议这样做,因为数据存储在内存中,因为如果重置应用程序或服务器,数据将会丢失。

答案 2 :(得分:1)

你的第一个问题就在你的方法中。你不一定关心你保存的时间,但你确实希望你的按钮在那个时候改变。

我可能建议从数据库加载DateTime值,将其放在JavaScript可以读取的页面中的某个位置。现在,唯一的问题是某些用户可能能够找到并修改此值以跳过计时器。我个人并不熟悉一种容易绕过这个问题的方法,但你应该能够研究一个解决方案。

一旦你有了JavaScript可读的值,循环可能是你最好的选择,可以根据你节省的时间检查当前时间,然后执行你想要的任何动作。

  1. do..while循环可能符合您的需求
  2. 为避免性能问题,请使用setTimeout延迟每次循环迭代。延迟不一定非常重要。
  3. 在循环中,检索当前日期和时间,然后将其与您在数据库中保存的日期和时间进行比较。如果当前日期和时间较长,请执行操作。
  4. 现在,我的想法可能不是最佳的,但我觉得这至少是朝着正确方向迈出的一步。我还建议一个循环,以便用户不需要刷新页面以查看执行的操作导致的更改。

答案 3 :(得分:1)

不要依赖客户端验证按钮被锁定/解锁。始终检查服务器端是否在允许的时间内发生了单击。这样可以防止有人进行黑客攻击。允许在允许窗口外单击的页面。