在ASP.NET MVC网站中运行重复任务

时间:2014-04-11 00:20:37

标签: c# asp.net-mvc azure

我正在开发一个ASP.NET MVC应用程序,我需要在一个时间间隔内不断更新文件。我最终将在Windows Azure上托管这个网站。

我只是想知道Phil Haack的帖子中提到的方法 The Dangers of Implementing Recurring Background Tasks In ASP.NET仍然是最好的方法,或者我应该考虑创建一个控制台应用程序,并使用Azure Web Jobs来运行它?

任何想法都赞赏。

谢谢, 丹尼尔

4 个答案:

答案 0 :(得分:1)

您可以这样做:

    private void AddHourlyTask(string task)
    {

        DateTime expiration = DateTime.Now.AddHours(1);
        expiration = new DateTime(expiration.Year, expiration.Month, expiration.Day, expiration.Hour, expiration.Minute, expiration.Second, expiration.Kind);

        OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
        HttpRuntime.Cache.Insert(
            task,
            task,
            null,
            expiration,
            Cache.NoSlidingExpiration,
            CacheItemPriority.NotRemovable,
            OnCacheRemove);
    }

然后在一个单独的函数中:

    public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
    {
        if (k == "HelloWorld")
        {
            Console.Write("Hello, World!");
            AddHourlyTask(k);
        }

这将作为:

进入您的Application_Start()函数
AddHourlyTask("HelloWorld");

为了使其正常工作,您还需要在课程中的某处添加:

private static CacheItemRemovedCallback OnCacheRemove = null;

这些功能都将存在于Global.asax.cs文件中

答案 1 :(得分:0)

您可能会考虑使用Windows任务计划程序安排一个简单的控制台应用程序,批处理文件,perl脚本等。根据它需要做什么,它可以像在ASP.Net MVC Web应用程序中调用Web方法一样简单。

答案 2 :(得分:0)

一种选择是研究Quartz

  

Quartz.NET是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。

我在ProgrammersHow do I make my ASP.NET application take an action based on time?

上提出了类似的问题

接受的答案:

  

由任务计划程序或Sql Server触发的计划任务是此处的方法。但是如果你真的想在你的webapp中管理它,你可能想看看像Quartz.NET这样的东西。它将允许您从CLR执行计划任务。那么你的挑战是"我如何确保AppDomain能够继续运行任务。"

     

另一种将其作为预定任务的方法,但保留了大部分"智能"在服务器上是使它成为一个可以通过HTTP使用某种授权密钥调用的任务。这可以让你编写一个相对简单的程序来调用它 - 如果不是一个简单的shell脚本 - 并且保留了很可能已经能够运行任务的web应用程序的复杂性。

     

无论哪种方式滚动你自己的任务管理器真是一条充满危险的道路。

答案 3 :(得分:0)

使用Revalee开源项目可以在ASP.NET MVC项目中调度任务。

Revalee是一项服务,允许您安排Web回调到您的Web应用程序)。在您的情况下,您将安排一个可以执行所需操作的回调(即更新文件)。 Revalee可以很好地处理离散事务操作的任务,例如更新数据库值或发送自动电子邮件消息(读取:不长时间运行)。执行操作的代码都将驻留在您的MVC应用程序中。当您的应用程序第一次启动时,您将安排第一次Web回调。当您的应用程序被回调以生成报告时,您将安排下一个回调。

要使用Revalee,您会:

  1. 在服务器上安装Revalee Service(Windows服务)。 Windows服务在源代码(您可以自己编译)或Revalee website中提供的预编译版本中提供。

  2. 在Visual Studio项目中使用特定于MVC的Revalee客户端库。 (也有一个非MVC版本。)客户端库在源代码中可用(您可以自己编译)或通过NuGet提供的预编译版本。

  3. 当你的应用程序第一次通过ScheduleHourlyCallback()方法启动时,你会注册一个未来的回调(这个例子假设你需要你的行动每小时运行一次)。

    private void ScheduleHourlyCallback()
    {
        // Schedule your callback for an hour from now
        var callbackTime = DateTimeOffset.Now.AddHours(1.0);
    
        // Your web app's Uri, including any query string parameters your app might need
        Uri callbackUrl = new Uri("http://yourwebapp.com/Callback/UpdateFile");
    
        // Register the callback request with the Revalee service
        RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl);
    }
    
  4. 当Revalee重新调用您的应用程序时,您的应用程序将执行您编码的任何操作您的应用程序也会调度下一个回调(通过调用ScheduleHourlyCallback()方法从你的控制者的行动中。)

  5. 我希望这会有所帮助。

    注意:上面的代码示例使用ScheduleCallback()的同步版本,Revalee客户端库也支持异步调用àla:

    RevaleeRegistrar.ScheduleCallbackAsync(callbackTime, callbackUrl);
    

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