簡體   English   中英

如何每24小時在Asp.net MVC中執行一個方法

[英]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,這在M​​VC中是否可行?

可能? 也許,在調用任務和后台線程時有點黑客攻擊。 可靠? 沒有絲毫。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM