IIS中是不是有类似cron作业的东西?

Posted

技术标签:

【中文标题】IIS中是不是有类似cron作业的东西?【英文标题】:Is there something like cron jobs in IIS?IIS中是否有类似cron作业的东西? 【发布时间】:2014-05-14 15:16:38 【问题描述】:

我正在开发一个 ASP.NET Web 应用程序。我需要每 10 分钟触发一次功能。所以目前我正在考虑一个“计划任务”或创建一个 Windows 服务来调用 URL。

但我记得有一次我在 php 网络托管空间中使用 cron 作业做了同样的事情。

那么在 IIS 中是否有类似 cron 作业的东西?

注意:我不希望使用 3rd-party 在线调度服务。

【问题讨论】:

【参考方案1】:

苹果和橙子。 cron 是一个 Unix 服务。 IIS 是一个 Web 服务器。正如cron 不包含在 Apache 或 nginx 中一样,IIS 包含调度程序是没有意义的。但是,您可以像在 Unix 上使用 cron 一样使用 schtasks.exe

您可能会在this question 中找到更多想法。

【讨论】:

【参考方案2】:

我同意@Amadan - 苹果和橘子。

然而,我倾向于为此目的编写自定义 Windows 服务,而不是使用 Windows 任务计划程序。 Another SO question 讲述了每个选项的优缺点。

虽然 Windows 服务的开发很简单(足够),但您可以考虑使用开源的 Topshelf 框架来缓解通常伴随它们而来的一些开发和部署怪癖。

公平地说,请记住cron 当然不是 PHP 的一部分,它只是在 *nix PHP 托管环境中可供您使用的一个工具:ASP.NET 确实没有什么不同;问题是在您的 ASP.NET 环境中,您可以使用哪些类似cron 的工具来满足您的要求和您的喜好。

【讨论】:

同意,自定义 Web 服务是更好的解决方案(并在我链接的问题中列出)。但schtasks.exe 是 Windows 中最接近 cron 的东西,它回答了 OP 提出的字面问题。 @Amadan:当然。除了将来可能需要更频繁地运行任务(每分钟不止一次)之外,这确实是 IMO 的 TMTOWTDI 事情。【参考方案3】:

您可能想看看Revalee 开源项目。

您可以使用它在特定时间安排网络回调。在您的情况下,您可以安排网络回调(未来 10 分钟)。当您的应用程序收到回调时,它可以安排下一个 10 分钟的回调。当您的 ASP.NET 应用程序第一次启动时,您将安排第一个 Web 回调。由于您的 Web 应用程序正在被回调,因此您无需担心 IIS 会卸载您的 Web 应用程序(它当然会卸载)。

例如使用 Revalee,您可以执行以下操作:

    在您的应用程序通过ScheduleTenMinuteCallback() 方法启动时注册未来(从现在起 10 分钟)回调(见下文)。

    private DateTimeOffet? previousCallbackTime = null;
    
    private void ScheduleTenMinuteCallback()
    
        // Schedule your callback 10 minutes from now
        DateTimeOffset callbackTime = DateTimeOffset.Now.AddMinutes(10.0);
    
        // Your web service's Uri
        Uri callbackUrl = new Uri("http://yourwebapp.com/ScheduledCallback.aspx");
    
        // Register the callback request with the Revalee service
        RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl);
    
        previousCallbackTime = callbackTime;
    
    

    当网络计划任务激活并回调您的应用程序时,您每 10 分钟执行一次您需要执行的任何操作并且您也计划下一次回调。为此,您可以将以下方法调用 (CallbackMonitor()) 添加到您的 ScheduledCallback.aspx 页面处理程序中。

    private void CallbackMonitor()
    
        if (!previousCallbackTime.HasValue 
            || previousCallbackTime.Value <= DateTimeOffset.Now.AddMinutes(-10.0))
        
            // Perform your "10 minutes have elapsed" action
    
            // ...do your work here...
    
            // Schedule subsequent 10 minute callback
            ScheduleTenMinuteCallback();
        
    
    

您关于不使用“第三方在线调度服务”的观点已被理解。 Revalee 服务不是外部的第 3 方在线调度服务,而是您在自己的网络上安装完全控制的服务(更具体地说是 Windows 服务)。它驻留在您自己选择的服务器上并运行在您自己选择的服务器上,很可能在您的防火墙后面,在那里它可以接收来自您在 IIS 上的 Web 应用程序的回调注册请求。 (当然,如果需要,它可以安装在 IIS Web 服务器上。)

我希望这会有所帮助。

免责声明:我是参与 Revalee 项目的开发人员之一。然而,需要明确的是,Revalee 是免费的开源软件。源代码在GitHub 上提供。

【讨论】:

-1:我假设 OP 想要一个常规的后台任务,它根本不属于 ASP.Net 应用程序。 如果“每 10 分钟运行一次”任务是长时间运行的任务,那么我完全同意你的看法——ASP.NET 应用程序不是执行此类任务的地方;但是,如果计划任务是一个离散的事务操作(例如,更新数据库值或发送自动电子邮件),那么 Revalee 可以帮助实现这一点,而无需设置繁琐的后端流程(想想:梳理数据库表中所有记录的常规夜间工作)。我的回答假设 OP 的计划任务是一个离散的操作。【参考方案4】:

对于新读者,现在您可以使用 QuartZ Library 从 .Net 或 .Net Core App 本身轻松创建后台 cron 作业。而不是创建任务和 Windows 服务。

【讨论】:

以上是关于IIS中是不是有类似cron作业的东西?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中设置 cron 作业

Google Apps 中的 Cron 作业是不是有时间限制?

如何每 2 小时运行一次 cron 作业?

在 Windows 服务器上运行“cron”作业 [重复]

如何在 Rails 4 上实现类似 cron 作业

如何在Node.js中管理Cron作业