在Web API应用程序上每分钟检查一个条件

时间:2014-10-23 13:28:11

标签: c# asp.net scheduled-tasks asp.net-web-api

我正在使用Microsoft WebAPI学习基本的Web应用程序开发。我创建了一个饮料订购服务,用户可以在此订购饮料,将其发布到服务器,然后服务器将其存储起来供以后使用。

用户将订单发布到OrdersController上的RESTful端点。端点将订单存储在列表中,并根据条件检查列表。例如,“订单数量是否> 5?”)。如果满意,服务器会使用Google Cloud Messaging服务向用户的手机发送推送通知。

我希望扩展可能触发推送消息的条件类型。例如,“如果在过去5分钟内未收到订单,则发送推送通知”。换句话说,我需要更频繁地检查条件,而不仅仅是为了接收新的订单请求。

实现这一目标的最佳方法是什么?我最初的想法是创建一个Timer,它会间隔运行条件检查方法,但搜索堆栈溢出表明这种方法might be一个bad idea

3 个答案:

答案 0 :(得分:2)

我有几个想法,具体取决于托管环境:

  1. 如果是您的服务器(虚拟或其他)
  2. 创建一个单独的应用程序,作为Windows服务或Windows应用程序运行,从webAPI单独处理该进程。

    1. 如果在Azure上作为云应用程序运行,您可以创建一个计划每隔很多分钟运行一次的Web辅助角色,然后可以查询和处理项目。

    2. 如果您只有MVC / WebAPI的托管环境,那么您可以查看缓存/回调技巧。您基本上在回调方法时向缓存添加一个条目。

    3. 一个。创建一个控制器方法,该方法将带有回调的缓存条目添加到方法

      湾该方法执行它需要做的任何工作,然后调用控制器操作,以便将另一个条目放在缓存中。

      每次缓存超时时,它都会调用回调方法,您可以使用该方法处理信息,然后调用控制器方法重新启动该过程。

      当我试验这个时,我创建了一个小型调度项目,它循环遍历任务列表。每项任务都负责确定是否需要进行任何处理。令人惊讶的是它运行良好,服务器永远不会关闭这个过程。

      请记住,如果您在云中托管,这将模拟活动和内存使用情况,这可能会花费您一些金钱,但我认为这将是非常值得的。

      1. 我听说他们正在安排解决方案,甚至可能是一个监控服务,它可以每隔很多分钟调用一次WebAPI端点,这可能与回调方法非常相似。每次监控服务调用端点时,您都​​可以检查是否需要处理。

答案 1 :(得分:0)

您可以使用Reactive Extensions:它允许您以声明方式编写与时间相关的事件,而无需费心处理超时和跟踪。您甚至可以通过controlling time itself!

测试您的设置

例如,要在某些不活动后触发事件,您可以使用可观察的Timeout方法。 Buffer方法可以让组在订购x饮料后触发事件等等

答案 2 :(得分:0)

一般来说,您所描述的内容听起来像是后端任务/责任。您可以考虑使用此库HangFire.io从ASP.NET安全地执行此操作 - http://hangfire.io/

您可以使用ASP.NET模拟事件触发的另一种简单的一次性案例,您是否可以使用内置缓存及其到期事件。