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

我在MVC中有方法

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

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

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

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

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

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

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

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

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

例如,您可以使用pingdom.com免费帐户在每次期间调用某个URL。 所以在pingdom中你可以输入你的MVC动作的URL。

 http://domain/controller/action 

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

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

 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(); } } } 

它的工作很好

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

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

Revalee Workflow http://sofzh.miximages.com/c%23/workflow.png

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

我同意@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从中引用,“HostingEnvironment.QueueBackgroundWorkItem方法允许您安排小的后台工作项.ASP.NET跟踪这些项目并阻止IIS突然终止工作进程,直到所有后台工作项都完成。 “

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

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