WebAPI开发中的定时处理

在WebAPI开发中会遇到一些需要定时或周期性处理的功能,比如每天早上6点从服务器下载数据或每隔半个小时查询统计数据等,有时也需要将数据向客户端推送。如何让web API也能处理定时或周期性的任务呢?


1.处理周期性任务

周期性的任务可以通过C#自带的Timer类来实现。具体思路就是创建一个Timer,定时去执行web API内的方法,再这个方法内可以执行具体的数据操作,也可以结合SignalR进行数据推送。具体实现如下:

1.1创建定时器


    /// 
    /// 定时任务辅助类
    /// 
    public class TimerHelper
    {
        //定时器
        System.Threading.Timer timer;
        //定时间隔(分钟)-从配置文件中读取
        private static int interval = int.Parse(System.Configuration.ConfigurationManager.AppSettings["TimerInterval"]);
        public TimerHelper()
        {
            timer = new System.Threading.Timer(TimerTask, null, 0, 1000 *60* interval);

        }

        /// 
        /// 定时任务
        /// 
        /// 
        public void TimerTask(object state)
        {
            //具体的方法
            Controllers.CommonController common = new Controllers.CommonController();
            common.BroadCast();
        }
    }

1.2具体方法实现


        /// 
        ///  定时推送
        /// 
        [ApiExplorerSettings(IgnoreApi = true)]
        public void BroadCast()
        {
            //数据处理
            //----略----
            //数据查询
            //----略----
            //数据推送
            Clients.All.AlarmCountRecord();
        }

由于这个方法只是内部调用,不对外开放,所以将方法对外隐藏。如果集成有第三方推送服务,如个推、极光等,也可以将推送的相关代码放到这里,这样就能够每隔半个小时或一小时向移动应用上推送消息了。

2.处理定时任务

上一部分的周期性任务是从Web站点启动开始,每隔一定时间就执行特定的操作,所以起始时间是不确定的,间隔时间是确定的。
这部分所讲的定时任务则是另外一种情况,比如每天早上八点向查询数据后向用户发送一封邮件,不论Web站点何时启动,每天早上八点这个时间是不变的,时间间隔始终是一天。如果采用上一部分的思路,就是创建一个定时器,每秒执行一次,判断到当前时间为早上八点就执行相应的方法,但显然这样做太浪费了。想到Windows计划任务和Windows服务可以做这样的事,这样问题不就解决了?
具体思路是,创建一个Windows计划任务,每天早上八点执行,调用一个bat脚本,用来访问WebAPI接口,执行相关逻辑。下面是具体实现:

2.1创建WebAPI接口

        public async Task<int> Auto()
        {
            int num = 0;
            try
            {
                MailModel model = new MailModel()
                {
                    ReceiverAddress = "",//收件人地址
                    ReceiverName = "",//收件人姓名
                    Title = "",//邮件标题
                    Content = "",//邮件内容
                    SenderAddress = "",//发件人地址
                    SenderName = "",//发件人姓名
                    SenderPassword = ""//发件人密码
                };
                bool result = MailHelper.SendMail(model);
            }
            catch (Exception)
            {
                num = -1;
            }
            return await Task.FromResult(num);
        }

这里写了一个用来发送邮件的接口作为示例。更详细例子看下面文章。

C#使用SMTP协议发送邮件(腾讯企业邮箱)

2.2安装curl

curl是利用URL语法在命令行方式下工作的开源文件传输工具,有了它,我们就可以自由调用web API接口了。安装过程可以百度,这里就不再赘述了。

2.3编写Windows脚本

@echo off 
echo "Start Send Mail..."
curl -d "" http://localhost:51307/api/Mail/Auto
echo "Finished"

脚本很简单,就是使用上一步安装的curl访问最开始创建的WebAPI接口。

2.4创建Windows计划任务

打开计算机管理>系统工具>任务计划程序。
WebAPI开发中的定时处理_第1张图片

点击“创建基本任务”开始创建计划任务。
WebAPI开发中的定时处理_第2张图片

选择触发器-每天
WebAPI开发中的定时处理_第3张图片

设定每天触发时间为早上八点。
WebAPI开发中的定时处理_第4张图片

选择操作>启动应用程序
WebAPI开发中的定时处理_第5张图片
选择上一步创建的Windos批处理程序。
WebAPI开发中的定时处理_第6张图片
最后完成创建。
WebAPI开发中的定时处理_第7张图片

以上步骤完成后,保存退出,之后每天早上八点就能收到邮件了。


本文中的两种定时处理情况是针对WebAPI中具体的需求所采取的解决方法,实际上还涉及了SignalR、邮件、Windows计划任务等。实际上针对这一类的轮询调度任务,如定时轮询数据库同步、定时邮件通知、定时数据处理等,可以使用开源的调度框架Quartz.NET。关于Quartz.NET的介绍将在以后的文章中推出。

你可能感兴趣的:(ASP.NET)