2009-09-20 31 views
5

Tôi có một ứng dụng ASP.NET MVC sử dụng NHiberante và SQL Server 2008 trên chương trình phụ trợ. Có các yêu cầu để gửi cả hai thông báo theo sự kiện theo định hướng trên cơ sở hàng ngày/hàng tuần VÀ chung thông báo hàng tuần.ASP.NET MVC + Ứng dụng SQL Server: Cách tốt nhất để gửi thông báo E-mail theo sự kiện

Dưới đây là một ví dụ về cách thức làm việc hướng sự kiện cần phải làm việc:

  1. nhân viên (s) tạo ra một số đơn đặt hàng.
  2. Thông báo e-mail được gửi hàng ngày đến bất kỳ người giám sát nào với một nhân viên cấp dưới đã thực hiện đơn đặt hàng với danh sách tất cả các đơn đặt hàng được tạo bởi cấp dưới yêu cầu sự chấp thuận của ông. Người giám sát chỉ nên nhận điều này một lần (ví dụ: nếu Nhân viên A tạo PO, người giám sát của anh ấy sẽ không nhận được email M EVI NGÀY cho đến khi anh ấy chấp thuận). Ngoài ra, danh sách đơn đặt hàng chỉ nên bao gồm các đơn hàng mà người giám sát KHÔNG thực hiện hành động chống lại. Nếu không có đơn đặt hàng nào cần sự chấp thuận của một giám sát viên cụ thể ... họ sẽ không nhận được e-mail.
  3. Thông báo bằng e-mail được gửi hàng ngày tới Bộ phận Người quản lý có danh sách tất cả đơn đặt hàng đã được người giám sát cấp dưới tán thành theo cách tương tự như số 2 ở trên.
  4. Bất kỳ lúc nào bất kỳ hành động nào được thực hiện liên quan đến việc phê duyệt PO của người giám sát hoặc phòng ban. quản lý, nhân viên sẽ nhận được một thông báo e-mail hàng ngày liệt kê TẤT CẢ những thay đổi như vậy. Nếu không có ai cho một nhân viên cụ thể, họ sẽ không nhận được một e-mail nào cả.

Vì vậy, cho một công việc như:

  • cách tốt nhất để sắp xếp các thông báo như vậy xảy ra hàng ngày là gì, hàng tuần hoặc thậm chí ngay sau khi một sự kiện xảy ra?
  • Làm cách nào để đảm bảo rằng các thông báo hướng sự kiện như vậy CHỈ được gửi một lần?
  • Bạn xử lý các ngoại lệ như thế nào để đảm bảo rằng các nỗ lực gửi e-mail không thành công được ghi lại và để có thể thực hiện một nỗ lực để gửi ngày hôm sau?

Cảm ơn!

Trả lời

2

Bạn có thể thêm một hành động bình thường trong một bộ điều khiển

Function SendEmails() As ActionResult 
    Dim result As String = "" 
    ''//big timeout to handle the load 
    HttpContext.Server.ScriptTimeout = 60 * 10 ''//ten minutes 

    result = DoTheActualWork() 

    ''//returns text/plain 
    Return Content(result) 

End Function 

Và sau đó gọi trang từ một nhiệm vụ theo lịch trình. Có thể là tác vụ được lên lịch trên máy chủ hoặc trong bất kỳ máy nào. Sử dụng một .vbs cho việc này:

SendEmails.vbs:

''//Force the script to finish on an error. 
On Error Resume Next 

''//Declare variables 
Dim objRequest 
Dim URL 

Set objRequest = CreateObject("Microsoft.XMLHTTP") 

''//Put together the URL link appending the Variables. 
URL = "http://www.mysite.com/system/sendemails" 

''//Open the HTTP request and pass the URL to the objRequest object 
objRequest.open "POST", URL , false 

''//Send the HTML Request 
objRequest.Send 

''//Set the object to nothing 
Set objRequest = Nothing 
+0

Điều này có khả năng hết thời gian chờ nếu A LOT của e-mail đang được gửi không? – wgpubs

+0

Có khả năng có (nó sẽ phụ thuộc vào máy chủ thư, phần cứng máy chủ web, v.v.). Kiểm tra và điều chỉnh cài đặt 'HttpContext.Server.ScriptTimeout' tương ứng –

0

Bạn có thể lưu trữ quy trình làm việc hoặc cửa sổ của cửa sổ. và thiết lập hàng đợi tin nhắn để xử lý các sự kiện này. Bạn có thể chỉ cần sử dụng cơ sở dữ liệu cho hàng đợi thư của bạn hoặc bạn có thể sử dụng hàng đợi thư ms hoặc sử dụng trình kích hoạt trong cơ sở dữ liệu. Nhưng loại chức năng này thực sự không phải là trách nhiệm của ứng dụng web giao diện người dùng của bạn. Nếu đẩy đến xô bạn có thể sinh ra một thread trong ứng dụng asp.net của bạn để xử lý hàng đợi này.

0

Âm thanh như một công việc cho một dịch vụ hoặc một công việc theo lịch trình.

Bạn không muốn làm điều đó trong ASP.NET vì bạn phải cấu hình IIS để giữ cho ứng dụng của bạn luôn hoạt động, điều này có thể không phải là ý tưởng tốt nhất.

Tác vụ đã lên lịch là tốt, nhưng bạn sẽ phải lập trình nó với tất cả logic để phân tích dữ liệu của bạn. Không phải là tốt nhất cho một sự phân tách của mối quan tâm. Ngoài ra, bạn sẽ phải cập nhật hai cơ sở mã nếu có thay đổi.

Dịch vụ không lý tưởng vì nó thực sự chỉ hoạt động mỗi ngày một lần. Nhưng bạn có thể thiết lập một dịch vụ wcf và có trang web xếp hàng các email bằng cách sử dụng dịch vụ.

4

tôi sẽ có tất cả các email của bạn, thông báo, vv được lưu vào một DB/bảng đầu tiên và sau đó có một dịch vụ mà các cuộc thăm dò cho các mục mới trong cơ sở dữ liệu hoặc bảng này xử lý việc gửi email/thông báo thực tế.

Để giải quyết các tình huống cụ thể của bạn, bạn có thể có bộ điều khiển ghi vào DB khi yêu cầu email/thông báo và dịch vụ bạn kiểm tra khoảng thời gian/sự kiện cụ thể cũng ghi vào DB để tạo email mới. Bằng cách này, ứng dụng và dịch vụ của bạn không thực sự quan tâm đến cách thức hoặc những gì đang xảy ra với các thông báo này, chúng chỉ nói rằng "Hãy làm gì đó". và dịch vụ email/thông báo thực sự đang thực hiện việc triển khai.

Lợi thế của việc này là nếu nhà cung cấp email của bạn không hoạt động, bạn sẽ không mất bất kỳ email nào và bạn có lịch sử tất cả các email được gửi cùng với chi tiết của họ khi nào, ai ... thay đổi người gửi email để thực hiện nhiều việc hơn, như gửi tới Twitter hoặc tin nhắn văn bản qua điện thoại, v.v. Điều này có hiệu quả làm giảm thông báo của bạn khỏi ứng dụng của bạn.

Tất cả các ứng dụng tôi đã thực hiện gần đây sử dụng loại mô hình này và nó đã ngừng các email bị mất do lỗi dịch vụ và các lý do khác. Nó cũng có thể tra cứu tất cả các email đã trải qua hệ thống và lấy số liệu cho phép tôi tối ưu hóa nhu cầu gửi email bằng cách lưu trữ thông tin bổ sung trong hồ sơ email như lý do được gửi, nếu nó báo cáo lỗi, v.v. .. Thêm vào các bổ sung như thông báo định tuyến (ví dụ: chuyển đến tin nhắn văn bản thay vào đó nếu email) dựa trên thời gian trong ngày hoặc người dùng có thể thực hiện mà không có thay đổi đối với ứng dụng chính.

Khách hàng của bạn có thể nghĩ rằng tất cả những gì họ cần là gửi email ngay hôm nay nhưng bạn nên đảm bảo giải pháp của mình đủ linh hoạt để không chỉ cho phép email trong tương lai chỉ với một vài tweek nhỏ.

+0

Về vấn đề theo dõi và lưu trữ các thông báo đã gửi .... nếu, ngoài mọi kênh truyền khác (email, twitter, et al), bạn tạo địa chỉ email của ứng dụng google, nhật ký tất cả các giao dịch với nó, bạn có thể nhấn vào công cụ tìm kiếm của google. Tìm kiếm trên không có gì nhiều hơn số thứ tự bạn nhận được tất cả các giao dịch liên quan. Áp dụng một số tính năng lọc đơn giản và bạn sẽ có được một số khả năng thực sự thú vị - nhúng liên kết phù hợp vào 'email' đó và bạn có thể gắn vào các cm hoặc báo cáo hệ thống con của ứng dụng. – justSteve

Các vấn đề liên quan