ASP.NET MVC中实现定时自动通过Telegram Bot API发消息的方案咨询
Hey Mahdi, 我来给你几个实用的方案,帮你在ASP.NET MVC里实现无需登录就能自动定时发Telegram消息的功能——毕竟你现在只能即时发送,定时这块确实需要找个靠谱的后台调度方式:
方案1:Windows任务计划程序(适合简单固定日期场景)
这是最省心的入门方案,不需要和Web应用绑定,完全独立运行:
- 核心思路:把发送Telegram消息的逻辑抽成一个独立的控制台程序,然后用Windows自带的任务计划,在指定日期触发这个程序执行。
- 操作步骤:
- 新建一个.NET控制台项目,把你现有的Telegram发送代码迁移过去(记得用
Telegram.BotNuGet包)。 - 编写代码判断当前时间是否匹配你指定的发送日期,匹配就发送消息。
- 打开Windows任务计划程序,新建任务:设置触发时间为你指定的2018/03/23、2018/03/28这些日期,操作选择启动你编译好的控制台程序。
- 新建一个.NET控制台项目,把你现有的Telegram发送代码迁移过去(记得用
- 代码示例:
using Telegram.Bot; using Telegram.Bot.Types.Enums; var botToken = "你的Telegram Bot Token"; var channelId = "@你的频道用户名"; var messageContent = "这是定时推送的消息内容"; // 可以把这些日期存在配置文件里,方便修改 var scheduledDates = new List<DateTime> { new DateTime(2018, 3, 23, 9, 0, 0), // 比如指定早上9点发送 new DateTime(2018, 3, 28, 15, 30, 0), new DateTime(2018, 4, 5, 10, 0, 0) }; var now = DateTime.Now; // 匹配到当天且时分一致就发送 if (scheduledDates.Any(date => date.Date == now.Date && date.Hour == now.Hour && date.Minute == now.Minute)) { var botClient = new TelegramBotClient(botToken); await botClient.SendTextMessageAsync( chatId: channelId, text: messageContent, parseMode: ParseMode.MarkdownV2 ); }
- 优缺点:
- 优点:零学习成本,实现快,不依赖Web应用,资源占用极低。
- 缺点:如果后续要动态修改发送时间或者添加复杂调度逻辑,维护起来比较麻烦。
方案2:Hangfire(适合Web应用内管理任务)
如果你希望在ASP.NET MVC应用内就能管理定时任务,Hangfire是个绝佳选择——它是.NET生态里成熟的后台任务调度库,支持持久化任务,即使Web应用重启也不会丢任务:
- 核心思路:在你的MVC项目中集成Hangfire,用它来调度发送消息的任务,Hangfire的后台服务会在Web应用启动时自动运行,不需要用户登录。
- 操作步骤:
- 安装Hangfire NuGet包:
Install-Package Hangfire - 在
Global.asax.cs的Application_Start里配置Hangfire(用SQL Server存储任务,也可以用Redis):
- 安装Hangfire NuGet包:
- 代码示例:
using Hangfire; using Telegram.Bot; using Telegram.Bot.Types.Enums; protected void Application_Start() { // 配置Hangfire连接到你的数据库 GlobalConfiguration.Configuration.UseSqlServerStorage("你的数据库连接字符串"); // 启动Hangfire后台服务和管理面板(访问/hangfire可以查看任务状态) app.UseHangfireDashboard(); app.UseHangfireServer(); // 批量添加指定日期的定时任务 var scheduledDates = new List<DateTime> { new DateTime(2018, 3, 23, 9, 0, 0), new DateTime(2018, 3, 28, 15, 30, 0), new DateTime(2018, 4, 5, 10, 0, 0) }; foreach (var sendTime in scheduledDates) { BackgroundJob.Schedule(() => SendTelegramMessage(), sendTime); } } // 封装发送消息的方法 private void SendTelegramMessage() { var botClient = new TelegramBotClient("你的Bot Token"); var channelId = "@你的频道用户名"; botClient.SendTextMessageAsync( chatId: channelId, text: "这是Hangfire调度的定时消息", parseMode: ParseMode.MarkdownV2 ).Wait(); }
- 注意事项:要确保你的Web应用所在的IIS应用池设置了“自动启动”,避免服务器重启后应用没启动导致任务不执行。
- 优缺点:
- 优点:支持动态添加/修改任务,有可视化管理面板,任务持久化,适合需要在Web应用内管理调度的场景。
- 缺点:依赖Web应用的运行环境,如果应用池回收,需要等应用重启后Hangfire才会继续执行任务。
方案3:Windows服务(适合长期稳定运行的后台任务)
如果需要最高的稳定性,完全脱离Web应用的依赖,Windows服务是最优解——它会随系统启动自动运行,不受Web应用状态影响:
- 核心思路:创建一个Windows服务项目,在服务内部用调度库(比如Quartz.NET)来管理定时任务,到点就触发Telegram消息发送。
- 操作步骤:
- 新建一个Windows服务项目(.NET Framework直接创建,.NET Core可以用Worker Service然后部署成Windows服务)。
- 安装Quartz.NET NuGet包:
Install-Package Quartz - 编写任务逻辑和调度配置,在服务启动时初始化任务。
- 代码示例:
using Quartz; using Quartz.Impl; using Telegram.Bot; using Telegram.Bot.Types.Enums; // 定义发送消息的任务 public class TelegramSendJob : IJob { public async Task Execute(IJobExecutionContext context) { var botClient = new TelegramBotClient("你的Bot Token"); await botClient.SendTextMessageAsync( chatId: "@你的频道用户名", text: "这是Windows服务推送的定时消息", parseMode: ParseMode.MarkdownV2 ); } } // 在服务的OnStart方法中配置调度 protected override void OnStart(string[] args) { var schedulerFactory = new StdSchedulerFactory(); var scheduler = schedulerFactory.GetScheduler().Result; scheduler.Start(); var scheduledDates = new List<DateTime> { new DateTime(2018, 3, 23, 9, 0, 0), new DateTime(2018, 3, 28, 15, 30, 0), new DateTime(2018, 4, 5, 10, 0, 0) }; foreach (var sendTime in scheduledDates) { // 创建任务 var job = JobBuilder.Create<TelegramSendJob>().Build(); // 创建触发器,指定触发时间 var trigger = TriggerBuilder.Create() .StartAt(sendTime) .Build(); // 绑定任务和触发器到调度器 scheduler.ScheduleJob(job, trigger).Wait(); } } protected override void OnStop() { // 服务停止时停止调度器 var schedulerFactory = new StdSchedulerFactory(); var scheduler = schedulerFactory.GetScheduler().Result; scheduler.Shutdown().Wait(); }
- 部署注意:编译后用
installutil命令或者PowerShell安装Windows服务,需要管理员权限。 - 优缺点:
- 优点:完全独立,稳定性极高,随系统启动,不受Web应用池回收、服务器重启影响。
- 缺点:开发和部署相对复杂,需要服务器管理员权限。
方案选择建议
- 如果你只是一次性的几个固定日期发送,选Windows任务计划最省事;
- 如果你需要在Web应用内管理任务、动态调整调度,选Hangfire;
- 如果你需要长期稳定运行,不依赖Web应用,选Windows服务。
内容的提问来源于stack exchange,提问作者Mahdi




