如何每24小时在Asp.net MVC中执行一个方法

时间:2014-07-02 16:50:06

标签: c# asp.net-mvc scheduled-tasks scheduler

我在MVC中有方法

 public void Sendmails()
 {
     //sending mails for every 24 hours.
 }

我可以安排上述方法每24小时执行一次。 我知道我们可以使用sql server agent和windows task scheduler设置日程安排。 但由于一些问题我只想执行当前的dll,这在M​​VC中是否可行?

6 个答案:

答案 0 :(得分:17)

可能?也许,在调用任务和后台线程时有点黑客攻击。 可靠吗?没有丝毫。

Web应用程序本质上是一个请求 - 响应系统。应用程序接收请求,执行其逻辑并返回响应。除此之外,它是空闲的。如果Web服务器想要使用或释放​​内存,那么Web服务器完全可以从内存中卸载。

要在没有用户交互的情况下定期运行某些内容(即,没有启动它的请求),Web应用程序就不是您想要的。相反,您正在寻找一个Windows服务或者可能是一个简单的控制台应用程序,该应用程序计划由主机系统的调度软件(Windows任务计划程序,cron等)定期运行。

当然,这些应用程序可以轻松共享代码。它们可以位于同一个解决方案中,并且可以引用相同的类库。实际上,代码的应用程序层应该始终尽可能轻薄,所有有意义的代码都应该在共享的业务逻辑程序集中。然后,任何应用程序(Web应用程序,Windows服务,控制台应用程序等)都可以简单地引用这些共享程序集并调用相同的逻辑。

此外,多个正在运行的应用程序也可以轻松共享相同的数据。它们既可以连接到同一个数据库(当然也可以使用共享数据访问逻辑),而且基本上是集中逻辑的相同的表示,恰好由不同的应用程序实例调用。

答案 1 :(得分:7)

就像所有人都说的那样,在.net Web应用程序中长时间运行后台进程以获得可靠性等不是一个好习惯。

您可以创建一个外部触发器,每24小时调用一次MVC操作方法。因此,您每24小时执行一次代码。有多种方法和服务可以做到这一点,我使用了不同的服务。或者,如果您不想使用第三方,则可以创建自己的。

例如,您可以使用pingdom.com免费帐户在<enter time here>个时段内拨打某个网址。所以在pingdom中你可以输入你的MVC动作的URL。

http://domain/controller/action

这将每24小时调用一次,您的代码将按计划运行。

更新:最近我一直在使用Azure调度程序,它是为这样的场景构建的。 https://azure.microsoft.com/en-us/services/scheduler/

答案 2 :(得分:5)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace Proposal_Sln
{
public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Interval = 1000;
        timer.Elapsed+=timer_Elapsed;
        timer.Start();
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Models.Proposal_DBEntities DB = new Models.Proposal_DBEntities();
        Models.tbl_Year Y = new Models.tbl_Year();
        Y.YearName = "13" + DateTime.Now.Second.ToString();
        DB.tbl_Year.Add(Y);
        DB.SaveChanges();
    }
 }
}

工作良好

答案 3 :(得分:3)

这听起来像Revalee的一个很好的用例。 Revalee是一个开源项目,旨在处理这种情况。它使用Windows服务管理任务持久性和调度,但利用Web应用程序来处理处理工作。在您的情况下,您可以安排通过服务每24小时调用一次SendEmail操作。

以下是使用Revalee的Web应用程序的工作流程:

Revalee Workflow http://revalee.sageanalytic.com/Images/workflow.png

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

答案 4 :(得分:1)

我同意@David,在Web应用程序中运行后台任务本质上是不可靠的,但有些情况下,这是有道理的。我建议先阅读这篇优秀文章,http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/

使用.NET 4.5.2,您可以利用HostingEnvironment,正如本文所述:http://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2从中引用,&#34; HostingEnvironment.QueueBackgroundWorkItem方法可让您安排小型后台工作项。 ASP.NET跟踪这些项目并阻止IIS突然终止工作进程,直到所有后台工作项都完成为止。&#34;

但同样,这不是一个好习惯,如果使用的话,应该非常明智地使用它。

答案 5 :(得分:0)

这是一个从Windows服务发送电子邮件的简单教程。您可以使用相同的数据库...等。 http://www.codeproject.com/Tips/704008/Send-Auto-Notification-Using-Windows-Service