我正在使用Microsoft WebAPI学习基本的Web应用程序开发。我创建了一个饮料订购服务,用户可以在此订购饮料,将其发布到服务器,然后服务器将其存储起来供以后使用。
用户将订单发布到OrdersController
上的RESTful端点。端点将订单存储在列表中,并根据条件检查列表。例如,“订单数量是否> 5?”)。如果满意,服务器会使用Google Cloud Messaging服务向用户的手机发送推送通知。
我希望扩展可能触发推送消息的条件类型。例如,“如果在过去5分钟内未收到订单,则发送推送通知”。换句话说,我需要更频繁地检查条件,而不仅仅是为了接收新的订单请求。
实现这一目标的最佳方法是什么?我最初的想法是创建一个Timer,它会间隔运行条件检查方法,但搜索堆栈溢出表明这种方法might be一个bad idea。
答案 0 :(得分:2)
我有几个想法,具体取决于托管环境:
创建一个单独的应用程序,作为Windows服务或Windows应用程序运行,从webAPI单独处理该进程。
如果在Azure上作为云应用程序运行,您可以创建一个计划每隔很多分钟运行一次的Web辅助角色,然后可以查询和处理项目。
如果您只有MVC / WebAPI的托管环境,那么您可以查看缓存/回调技巧。您基本上在回调方法时向缓存添加一个条目。
一个。创建一个控制器方法,该方法将带有回调的缓存条目添加到方法
湾该方法执行它需要做的任何工作,然后调用控制器操作,以便将另一个条目放在缓存中。
每次缓存超时时,它都会调用回调方法,您可以使用该方法处理信息,然后调用控制器方法重新启动该过程。
当我试验这个时,我创建了一个小型调度项目,它循环遍历任务列表。每项任务都负责确定是否需要进行任何处理。令人惊讶的是它运行良好,服务器永远不会关闭这个过程。
请记住,如果您在云中托管,这将模拟活动和内存使用情况,这可能会花费您一些金钱,但我认为这将是非常值得的。
答案 1 :(得分:0)
您可以使用Reactive Extensions:它允许您以声明方式编写与时间相关的事件,而无需费心处理超时和跟踪。您甚至可以通过controlling time itself!
测试您的设置例如,要在某些不活动后触发事件,您可以使用可观察的Timeout
方法。 Buffer
方法可以让组在订购x饮料后触发事件等等
答案 2 :(得分:0)
一般来说,您所描述的内容听起来像是后端任务/责任。您可以考虑使用此库HangFire.io从ASP.NET安全地执行此操作 - http://hangfire.io/
您可以使用ASP.NET模拟事件触发的另一种简单的一次性案例,您是否可以使用内置缓存及其到期事件。