设置一个 MVC ASP.NET 应用程序来执行计划任务 - 实现方法?

Setting an MVC ASP.NET application to do scheduled tasks - Method to achieve it?

我正在构建一个将从 xml 提要中获取数据的网站。我将其构建为 MVC AP.NET 应用程序。例如,我需要应用程序每 2 分钟从位于提供商服务器上的 xml 文件中获取数据。然后将存储这些数据。 我的问题是,我希望从网站上传到服务器的那一刻起,这些过程就可以不间断地完成。我正在考虑在主要方法(?)中使用计时器每 2 分钟获取一次数据。但我在这里搜索了其他主题,发现使用 AppFabric 是解决方案。问题是我是一个绝对的初学者,我发现它很难使用......是否有其他更简单的方法来实现从xml文件中持续更新数据?

我建议您使用 Quartz 来处理调度,而不是使用内置计时器。我在最近的两个项目中使用了 Quartz,给我留下了深刻的印象。它可以处理您能想到的任何时间表。

http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html

创造就业机会的例子:

using Quartz;
using Quartz.Impl;

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();

IJobDetail integrationJob = JobBuilder.Create<IntegrationJob>().Build();

ITrigger integrationTrigger = TriggerBuilder.Create()
            .StartNow()
            .WithSimpleSchedule(x => x.WithIntervalInSeconds(300).RepeatForever()).Build();

scheduler.ScheduleJob(integrationJob, integrationTrigger);


public class IntegrationJob : Ijob
{
    public void Execute(IJobExecutionContext context)
    {
        //Write code for job
    }
}

另一种更简单、更直接的方法是在您的 Visual Studio 解决方案中创建一个控制台项目,然后让 Windows 任务计划程序启动它。为此,您的解决方案中至少需要包含以下三个项目:

  • 一个 Class 包含领域模型和存储库的库项目 classes
  • ASP.NET MVC 网络应用程序(引用领域模型项目)
  • 控制台项目(引用领域模型项目)

理想情况下,您会坚持领域驱动设计,这样您的业务逻辑就会封装在您的领域模型中,因此可以在您的 Web 应用程序和控制台应用程序之间移植。

真的,我会为任何可能不仅仅是网络应用程序的项目推荐此解决方案设置:

  • MyApp.Models:一个 Class 领域模型库和存储库 classes。利用 Domain Driven Design and the Repository Pattern 使核心业务逻辑和对持久存储的访问在 VS 项目之间可移植
  • MyApp.Models.Tests:模型的单元测试class 库
  • MyApp.Web: MVC 或 WebForms 项目
  • MyApp.Web.Tests:您的 Web 项目的单元和功能测试。
    • 单元测试:使用您最喜欢的测试 运行ner(MS 测试、NUnit、xUnit 等)
    • 功能测试:CodedUI tests from Microsoft or WatiN allow you to drive the web browser programmatically. I would also recommend SpecFlow for those who want to do Behavior Driven Development
  • MyApp.Console: 可以运行作为后台作业的控制台应用程序
  • MyApp.Console.Tests:控制台应用程序的单元测试

我知道这似乎有点矫枉过正,但根据我的经验,随着时间的推移,项目似乎总是倾向于这种结构。考虑到这种结构来构建项目很容易,并且会为您提供很大的灵活性,因为业务不可避免地会陷入疯狂,并要求您的应用程序做除了煮咖啡以外的所有事情(毕竟,这就是实习生的工作!)。 =18=]

您可能想研究使用 Hangfire。它可以让您安排任务,并为您提供一个漂亮的仪表板来管理任务。您可以在 NuGet 中找到它,并且 Hangfire 站点上的文档非常好。

它非常易于使用,这里是一个示例,说明如果您想每分钟 运行 一个作业,您必须添加到 OWIN 启动程序 class 中:

public void Configuration(IAppBuilder app)
{
    app.UseHangfire(config =>
    {
        config.UseSqlServerStorage("connection string");
        config.UseServer();
    });

   InitializeJobs();
}

public static void InitializeJobs()
{            
    RecurringJob.AddOrUpdate("jobName", () => CallToJobFunction(), Cron.Minutely);
}

查看 hanselman 的博客,他在其中讨论了这个主题: http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx