2011-03-15 60 views
2

根據此答案here,我需要將電子郵件放入隊列並運行後臺任務併發送它們。我如何使用ASP.NET-MVC和WCF的體系結構來實現這一點?如何在asp.net-mvc/wcf應用程序中運行後臺代碼

  1. 如何建立隊列(sql server)?
  2. 如何構建後臺任務?
+0

我不知道這是做一個偉大的方式,但它是對的NuGet的事實使得它的吸引力。 :) http://www.hanselman.com/blog/NuGetPackageOfTheWeek2MvcMailerSendsMailsWithASPNETMVCRazorViewsAndScaffolding.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ScottHanselman+%28Scott+Hanselman+-+ComputerZen.com%29 – RMD

回答

0

你可以用許多不同的方式給這隻貓蒙皮。關鍵在於電子郵件的實際發送與電子郵件的排隊不同步。

  1. 通過WCF服務使用MSMQ綁定通過這一系列博客文章(假定IIS 7:MSMQ, WCF, and IIS: Getting Them to Play Nice)排隊消息。
  2. 將消息排隊到MSMQ。 MSMQ是一個很好的(有時未充分利用的)Windows內置的隊列服務。你將編寫一個Windows服務來接收來自這個隊列的消息。如果您有IIS 7,請查看Death to Windows Services, Long Live AppFabric。 MSMQ是一件輕而易舉的事情,但有一些古怪的限制(4MB消息大小和可用性)
  3. 將消息排隊到'sql隊列'。創建一個表來保存基本的排隊消息信息,然後創建存儲過程以包裝隊列語義(例如,您不希望多個消費者接收相同的消息)。沒有困難,但有一點點時間才能正確。
  4. 將消息排隊到Service Broker(甚至是MSMQ)並編寫一個從Service Broker隊列接收消息的Windows服務。 Service Broker爲您處理排隊語義(競爭消費者)。不足之處在於它在治理屁股方面很痛苦。

HTH,

ž

0

我認爲你的解決方案是獨立於你使用MVC的事實。

我過去實現這一點的方式是堅持事實,您需要將一封電子郵件發送到數據庫,然後使用Windows服務進行處理。

另一種方法是將MSMQ用作存儲介質。一般來說,MSMQ不應該用來「存儲」數據,只能用作消息傳輸機制,但在這種情況下它肯定是一種選擇。

在開發「隊列」方面,如果電子郵件由於某種原因需要有序交付,只需在數據庫表中添加一個「RequestedDTTM」列,就可以按請求的順序發送它們。

最後,我會考慮實現一個簡單的多線程電子郵件發件人以最大限度地提高性能。在.NET 4.0中使用TPL會使這非常容易。或者,您可以使用類似SmartThreadPool庫(codeplex.com上提供的)來管理您的電子郵件發件人線程。

正如在你鏈接到的其他答案中提到的,你的UI不應該做這個電子郵件發送。