2010-09-29 174 views
1

我有一個數據錄入和編輯表單,並且在每個數據錄入或更新事件中,我都必須發送一封電子郵件給收件人的動態列表。一旦用戶點擊保存或編輯按鈕,我一直在發送電子郵件,但我想先將數據保存到數據庫,然後再發送電子郵件。我想這樣做的部分原因是爲了提高應用程序的響應時間,因爲發送電子郵件往往需要很長的時間。將數據保存到SQL Server數據庫中,然後再發送郵件

有沒有人做過一些與此有關的事情,有沒有一種更好的方式來實現類似的東西,或者知道一個很好的教程。

電子郵件正文爲html格式。

+0

爲什麼發送需要很長時間?你發送給收件人嗎?嘗試將拾音器放入拾音器目錄,然後從那裏發送MTA。 – TomTom 2010-09-29 07:17:12

+0

TomTom - 我發送給收件人,我嘗試異步發送,但那不是和idfference。 – StackTrace 2010-09-29 07:22:31

回答

1

我同意ck關於使用服務和消息隊列,但也有一些替代方案。

一個是使用一個服務,定期輪詢數據庫。這可以讓你避免消息隊列的代價是更高的CPU負載(該服務將執行許多不必要的數據庫調用)。

您也可以使用數據庫觸發器或數據庫中的計劃作業直接在數據庫中執行此操作。最新版本的SQL Server支持運行用C#或Vb.Net編寫的存儲過程,因此您可以在這裏重用大部分現有代碼。

最後,你可以去一個簡單的解決方案,你在asp.net應用程序的單獨線程上發送電子郵件。這樣可以避免使用服務應用程序,您可以像現在一樣重複使用代碼。

+0

符文格里姆斯塔德 - 我試着發送一個單獨的線程在我的asp.net應用程序,但它如何沒有任何區別 – StackTrace 2010-09-29 07:28:25

+0

我想我可能會認真考慮數據庫觸發器或數據庫中的計劃作業 – StackTrace 2010-09-29 07:30:07

+0

你是如何開始新線程?我認爲它應該工作,如果你使用ThreadPool.QueueUserWorkItem方法。參考:http://haacked.com/archive/2009/01/09/asynchronous-fire-and-forget-with-lambdas.aspx – 2010-09-29 08:52:06

2

您可以編寫一個處理髮送電子郵件的Windows服務,然後使用Message Queue作爲將數據從應用程序傳遞到服務的方法。即您的應用程序保存數據,然後向隊列添加消息。該服務不斷輪詢隊列中的消息,並將每個消息作爲電子郵件發送。

+0

Orr你跳過消息隊列(單獨安裝,通常不可用)並使用服務代理(在sql server中具有相同的功能)。 – TomTom 2010-09-29 07:16:49

0

執行此操作的一種方法是寫入數據庫,然後在通知電子郵件服務(寫爲Windows服務)的隊列中放入一條消息,指出有電子郵件要發送。然後電子郵件服務與數據庫進行交談,以查找實際需要執行的操作。這將電子郵件服務從Web應用程序中分離出來,同時也避免了輪詢。

這與ck的解決方案略有不同,因爲隊列消息被用作觸發器而不是包含電子郵件信息。這在一定程度上解除了網絡應用程序和電子郵件服務的分離,並且意味着電子郵件服務可以被多個客戶端重複使用,而無需每個客戶端都必須遵守(並且保持一致)相同的電子郵件格式。

相關問題