我在MVC中有方法
public void Sendmails()
{
//sending mails for every 24 hours.
}
我可以安排上述方法每24小时执行一次。 我知道我们可以使用sql server agent和windows task scheduler设置日程安排。 但由于一些问题我只想执行当前的dll,这在MVC中是否可行?
答案 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