调度Web Api方法以设置的间隔运行

The*_*ads 10 c# asp.net-web-api

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

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

抱歉没有代码样本可以使用,因为我还没有找到一个基础.

Ion*_*316 11

如果您需要安排后台任务每周运行,您可以使用FluentScheduler(NuGet链接)为您运行它.你可以这样做:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 没有任何错误,我尝试调试并注意到,未调用 Execute() 方法,经过一些谷歌搜索,我用这个 'JobManager.AddJob(() =&gt; scheduler.SendTaskRemainderNotification(), s =&gt; s.WithName("[TaskRemainder]").ToRunNow().AndEvery(1).Days());' (2认同)

Jus*_*now 6

Web Api 中并没有真正的方法来实现您的愿望。无论如何,Web API 应该是无状态的。

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

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


Cod*_*ter 2

这不是您希望 Web API 执行的操作,我也不认为它会执行此操作。关于单一职责的一些事情。

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