[英]How to execute a method in Asp.net MVC for every 24 hours
我在MVC中有方法
public void Sendmails()
{
//sending mails for every 24 hours.
}
我可以安排上述方法每24小時執行一次。 我知道我們可以使用sql server agent和windows task scheduler設置日程安排。 但是由於某些問題我只想執行當前的dll,這在MVC中是否可行?
可能? 也許,在調用任務和后台線程時有點黑客攻擊。 可靠? 沒有絲毫。
Web應用程序本質上是一個請求 - 響應系統。 應用程序接收請求,執行其邏輯並返回響應。 除此之外,它是空閑的。 如果Web服務器想要使用或釋放內存,那么Web服務器完全可以從內存中卸載。
要在沒有用戶交互的情況下定期運行某些內容(即,沒有啟動它的請求),Web應用程序就不是您想要的。 相反,您正在尋找一個Windows服務或者一個簡單的控制台應用程序,該應用程序計划由主機系統的調度軟件(Windows任務計划程序,cron等)定期運行。
當然,這些應用程序可以輕松共享代碼。 它們可以位於同一個解決方案中,並且可以引用相同的類庫。 實際上,代碼的應用程序層應該始終盡可能輕薄,所有有意義的代碼都應該在共享的業務邏輯程序集中。 然后,任何應用程序(Web應用程序,Windows服務,控制台應用程序等)都可以簡單地引用這些共享程序集並調用相同的邏輯。
此外,多個運行的應用程序也可以輕松共享相同的數據。 它們既可以連接到同一個數據庫(當然也可以使用共享數據訪問邏輯),而且基本上是集中邏輯的相同表示,恰好由不同的應用程序實例調用。
就像每個人都說的那樣,在.net Web應用程序中長時間運行后台進程以獲得可靠性等不是一個好習慣。
您可以創建一個外部觸發器,每24小時調用一次MVC操作方法 。 因此,您每24小時執行一次代碼。 有多種方法和服務可以做到這一點,我使用了不同的服務。 或者,如果您不想使用第三方,則可以創建自己的。
例如,您可以使用pingdom.com免費帳戶在每次<enter time here>
期間調用某個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://revalee.sageanalytic.com/Images/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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.