2013-04-07 24 views
14

每天一次,我希望我的ASP.NET MVC4網站可能在多臺服務器上運行,以便將報告通過電子郵件發送給我。這似乎是一件很常見的事情,但我想要一個很好的方法來做到這一點很困難。如何在ASP.NET MVC網站上執行定期工作?

嘗試在服務器上運行計時器來完成這項工作有幾個原因是有問題的。如果我有多臺服務器,那麼我會讓計時器在所有服務器上運行(以防服務器故障);我需要在它們之間進行協調,這會變得複雜。此外,試圖通過實體框架從後臺線程訪問數據庫增加了複雜性,我必須採用鎖定策略來序列化週期性後臺線程和「前臺」控制器線程之間的DbContext對象的構建/處置。

另一種選擇是在服務器上運行一個計時器,但讓計時器線程執行一個GET操作,生成一個生成並通過電子郵件發送報告的魔法頁面。這解決了DbContext問題,因爲數據庫訪問發生在正常的Controller操作中,並與所有其他Controller訪問數據庫進行序列化。但是我仍然遇到可能運行多個計時器的問題,所以我需要在Controller動作中使用一些智能來忽略多餘的報告請求。

有什麼建議嗎?這種事情通常如何完成?

+3

快速的答案是,你不應該從網站做到這一點。最簡單的解決方案是創建一個可執行文件來爲您完成工作並使用任務計劃程序進行安排。這取決於您的複雜程度和需求水平,有很多變化,但是從最簡單的時間表開始。不要通過網站做到這一點。工作錯誤的工具。 – Khepri 2013-04-07 06:23:52

回答

13

您不應該從您的web應用程序執行此任務,因爲Phil Haack在his blog post中很好地解釋了它。

這種事情通常是怎麼做的?

您可以從Windows服務甚至計劃使用Windows計劃程序定期運行的控制檯應用程序執行此任務。

+2

如果您在服務器上沒有設置計劃任務的權限,則可以使用IPPatrol等第三方服務來定期向您的網站發送HTTP請求。 – Dai 2013-04-07 09:00:23

3

正確的解決方案是創建一個獨立於您的網站運行的後臺服務。但是,如果這不是一個選項,那麼您可以使用緩存,如Jeff Atwood在Easy Background Tasks in ASP.NET中所述。

+1

我會注意到'System.Web.Caching.Cache'在內部使用'System.Timers.Timer'實例,所以你可以直接使用它。 – Dai 2013-04-07 09:02:40

+0

完全不推薦的方法。這仍然在Web應用程序中運行,可隨時由IIS回收,以消除您可能啓動的所有後臺任務。實現這一目標的唯一可靠方法是在進程外執行這些任務。 – 2013-04-07 09:12:48

1

有幾個選項:

  • 如果您在Azure上託管的網站,看看這是最近發佈的預覽(http://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/
  • WebJobs如果你不想提取出來的痛您的網站之外的電子郵件邏輯,通過url(使用處理程序,mvc操作等)公開該功能,然後運行按計劃訪問該URL的Windows計劃任務。
  • 編寫一個簡單的控制檯應用程序,通過Windows計劃任務類似地執行。
  • 或者編寫一個簡單的Windows服務,它在內部循環並檢查時間和到達時間,點擊該URL,運行該exe文件,或者使用它自己的代碼向您發送電子郵件。
相關問題