在WebAPI开发中会遇到一些需要定时或周期性处理的功能,比如每天早上6点从服务器下载数据或每隔半个小时查询统计数据等,有时也需要将数据向客户端推送。如何让web API也能处理定时或周期性的任务呢?
周期性的任务可以通过C#自带的Timer类来实现。具体思路就是创建一个Timer,定时去执行web API内的方法,再这个方法内可以执行具体的数据操作,也可以结合SignalR进行数据推送。具体实现如下:
///
/// 定时任务辅助类
///
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();
}
}
///
/// 定时推送
///
[ApiExplorerSettings(IgnoreApi = true)]
public void BroadCast()
{
//数据处理
//----略----
//数据查询
//----略----
//数据推送
Clients.All.AlarmCountRecord();
}
由于这个方法只是内部调用,不对外开放,所以将方法对外隐藏。如果集成有第三方推送服务,如个推、极光等,也可以将推送的相关代码放到这里,这样就能够每隔半个小时或一小时向移动应用上推送消息了。
上一部分的周期性任务是从Web站点启动开始,每隔一定时间就执行特定的操作,所以起始时间是不确定的,间隔时间是确定的。
这部分所讲的定时任务则是另外一种情况,比如每天早上八点向查询数据后向用户发送一封邮件,不论Web站点何时启动,每天早上八点这个时间是不变的,时间间隔始终是一天。如果采用上一部分的思路,就是创建一个定时器,每秒执行一次,判断到当前时间为早上八点就执行相应的方法,但显然这样做太浪费了。想到Windows计划任务和Windows服务可以做这样的事,这样问题不就解决了?
具体思路是,创建一个Windows计划任务,每天早上八点执行,调用一个bat脚本,用来访问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协议发送邮件(腾讯企业邮箱)
curl是利用URL语法在命令行方式下工作的开源文件传输工具,有了它,我们就可以自由调用web API接口了。安装过程可以百度,这里就不再赘述了。
@echo off
echo "Start Send Mail..."
curl -d "" http://localhost:51307/api/Mail/Auto
echo "Finished"
脚本很简单,就是使用上一步安装的curl访问最开始创建的WebAPI接口。
选择操作>启动应用程序
选择上一步创建的Windos批处理程序。
最后完成创建。
以上步骤完成后,保存退出,之后每天早上八点就能收到邮件了。
本文中的两种定时处理情况是针对WebAPI中具体的需求所采取的解决方法,实际上还涉及了SignalR、邮件、Windows计划任务等。实际上针对这一类的轮询调度任务,如定时轮询数据库同步、定时邮件通知、定时数据处理等,可以使用开源的调度框架Quartz.NET。关于Quartz.NET的介绍将在以后的文章中推出。