【问题标题】:Conducting timed tasks in a web-site - best practice?在网站中执行定时任务 - 最佳实践?
【发布时间】:2016-04-09 08:04:26
【问题描述】:

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

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

  1. 将当前日期时间戳保存到数据库(我以注册用户身份登录网站)
  2. 每次我使用按钮访问页面时,我都会检索戳记和持续时间
  3. 并计算我需要等待多长时间才能解锁按钮。

(并且可能实现一个显示在按钮附近的 JS(例如)倒计时计数器)

我认为使用会话变量或 cookie 是个坏主意,因为我可能会关闭我的网站或删除我的用户数据,从而丢失上述内容。

【问题讨论】:

    标签: c# concept


    【解决方案1】:

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

    数据库

    添加一个LockedUntilUtc 列,指示按钮应解锁的日期/时间。更好的是,命名列来代表业务模型。也许您正在编写一个 HR 应用程序,该应用程序有一个加薪审批流程,并且在经理发布加薪以允许 HR 审查之前有一个强制性的 7 天等待期,并且按钮被标记为“发布加薪”在这种情况下我'将其命名为 PublishRaiseAvailableUtc

    我已经处理过很多这样的场景,使用事件需要发生的日期/时间通常更简单。而不是保存计时器的开始时间并且每次需要进行计算时都必须添加 7 天。

    用户界面

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

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

    服务器后验证

    当用户点击按钮,POST 被发送到服务器时,服务器端代码应该从数据库中检索PublishRaiseAvailableUtc 的值(不要相信从隐藏字段发布的值),并比较到服务器时间。 IE。服务器时间应该大于PublishRaiseAvailableUtc,假设您确保您正在比较 UTC 时间。

    【讨论】:

      【解决方案2】:

      我认为最好的方法是在按钮再次解锁时挽救这一天。每次加载页面时,从数据库中检索该信息以检查它是否应该被锁定。

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

      【讨论】:

        【解决方案3】:

        您的第一个问题在于您的方法。您不一定在乎要等多长时间才能节省时间,但您肯定希望在该时间到来时更改您的按钮。

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

        一旦您获得了 JavaScript 可读的值,循环可能是您检查当前时间与保存时间的最佳选择,然后执行您想要的任何操作。

        1. do..while 循环可能会满足您的需求
        2. 为避免性能问题,请使用setTimeout 来延迟每次循环迭代。延迟不一定非常严重。
        3. 在循环中,检索当前日期和时间,然后将其与您保存在数据库中的日期和时间进行比较。如果当前日期和时间更大,请执行您的操作。

        现在,我的想法可能不是最优的,但我觉得这至少是朝着正确方向迈出的一步。我还建议一个循环,这样用户就不需要刷新页面来查看执行的操作导致了哪些更改。

        【讨论】:

          【解决方案4】:

          不要依赖客户端验证按钮是否已锁定/解锁。始终检查服务器端是否在允许的时间内发生了点击。这将防止有人“入侵”页面以允许在允许的窗口之外进行点击。

          【讨论】:

          • 技术上是的,总是这样,但是在不需要刷新页面的情况下解锁按钮会很好。不过,使用 UpdatePanel 应该不是不可能的......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-19
          • 2013-09-18
          • 2010-11-10
          相关资源
          最近更新 更多