13

在我当前的项目中,需要安排一种方法以设定的时间间隔运行,例如每周一次,目前这是通过创建 HttpClient 并点击所需控制器方法的 Windows 服务完成的。

我想知道这是否可以在 Web Api 项目本身中实现自动化,而不是使用外部服务。到目前为止,我还没有找到任何关于这样做的文档。

很抱歉没有可以使用的代码示例,因为我还没有找到一个可以开始的基础。

4

4 回答 4

13

如果您需要安排一个后台任务每周运行,您可以使用FluentSchedulerNuGet 链接)为您运行它。你可以这样做:

public class WeeklyRegistry : Registry
{
    public WeeklyRegistry()
    {            
        Schedule<WeeklyTask>().ToRunEvery(1).Weeks(); // run WeeklyTask on a weekly basis           
    }
}

public class WeeklyTask : IJob
{
    public void Execute()
    {            
        // call the method to run weekly here
    }
}

更新FluentScheduler的新版本稍微改变了 API。该任务现在应该来自 IJob,而不是 ITask。更新了我的示例以反映这一点。

于 2014-07-29T17:37:37.543 回答
6

在 Web Api 中并没有真正实现您想要的方法。Web API 无论如何都应该是无状态的。

理论上,您可以在 Web 服务器上创建一个长时间运行的任务来定期调用您的 Api(或直接调用该方法),放置此类方法的最佳位置是全局 asax 文件中的 OnStart 方法。但是,当 Web 服务器加载到应用程序域时会运行此方法,并且当 Web 服务器决定卸载您的应用程序时,该任务将被终止。因此,如果您至少一次不调用您的 Web 服务器,您的任务将不会启动。如果您的网络服务器没有定期访问,您的任务将被终止。

拥有外部可靠资源(例如您的服务)仍然是最好和最安全的方法。

于 2013-03-13T11:03:51.047 回答
2

这不是您希望 Web API 做的事情,我不认为它会做。关于单一职责的一些事情。

服务方式有什么问题?您可能还想看看 Windows 任务计划程序。

于 2013-03-13T11:03:04.147 回答
0

我并不是说这是最好的方法,但它对我有用,而且很容易。

我们的 WebApi 已经到位,我需要一个快速的解决方案来每小时调用一次 API。我使用了 node.js 并编写了几行代码来利用 moment.js 库。有一个计时器/倒计时功能可用。我将它设置为每小时触发一次并调用我们的 API。让它在IIS上工作。这是在我以前的雇主那里,否则我会发布实际代码。

这很容易,而且很有效。希望它可以帮助某人。 node.js + moment.js库。

于 2019-01-17T04:22:55.530 回答