2009-09-20 9 views
5

Mam aplikację ASP.NET MVC, która wykorzystuje usługi NHiberante i SQL Server 2008 na zapleczu. Istnieją wymagania dotyczące wysyłania powiadomień o zdarzeniach związanych z wydarzeniami w trybie z codziennymi/cotygodniowymi powiadomieniami AND o ogólnych powiadomieniach tygodniowo.Aplikacja ASP.NET MVC + SQL Server: najlepszy sposób wysyłania powiadomień e-mail sterowanych zdarzeniami

Oto przykład tego, jak workflow zdarzeniami musi pracować:

  1. pracownika (ów) tworzy kilka zamówień.
  2. Powiadomienie e-mail jest wysyłane codziennie do dowolnego przełożonego z podległym pracownikiem, który złożył zamówienie zakupu z listą wszystkich zamówień złożonych przez podwładnych, które wymagają jego zatwierdzenia. Przełożony powinien otrzymać to tylko raz (np. Jeśli Pracownik A utworzy PO, jego przełożony nie powinien otrzymywać wiadomości e-mail KAŻDEGO DNIA, zanim nie zatwierdzi). Ponadto lista zamówień powinna obejmować TYLKO te, na które osoba nadzorująca NIE podjęła działań. Jeśli żadne zamówienia zakupu nie wymagają zatwierdzenia przez danego przełożonego ... nie powinny otrzymywać wiadomości e-mail.
  3. Powiadomienie e-mail wysyłane jest codziennie do Departamentu Kierowników z listą wszystkich zamówień ZATWIERDZONY przez podległych przełożonych w sposób podobny do punktu 2 powyżej.
  4. Za każdym razem, gdy podejmowana jest decyzja o zatwierdzeniu zamówienia przez przełożonego lub dział. menedżer, pracownik powinien codziennie otrzymywać powiadomienia e-mail z wykazem WSZYSTKICH takich zmian. Jeśli nie ma żadnego dla danego pracownika, nie powinien on w ogóle otrzymywać wiadomości e-mail.

Więc biorąc pod uwagę taki obieg:

  • , co jest najlepszym sposobem, aby zaplanować takie zgłoszenia się zdarzyć codziennie, co tydzień lub nawet natychmiast po wystąpieniu zdarzenia?
  • W jaki sposób zapewnisz, że takie powiadomienia kierowane zdarzeniem będą WYŁĄCZNIE dostarczane jednorazowo?
  • Jak obsługiwać wyjątki, aby upewnić się, że nieudane próby wysłania wiadomości e-mail są rejestrowane i aby można było wysłać próbę wysłania następnego dnia?

Dzięki!

Odpowiedz

2

Możesz dodać normalnego działania w kontrolerze

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 

a następnie wywołać stronę z zaplanowanego zadania. Może być zaplanowanym zadaniem na serwerze lub w dowolnej maszynie. Użyj .vbs dla tego:

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

może to potencjalnie Timeout Jeśli dużo e-maili są wysyłane? – wgpubs

+0

Potencjalnie tak (to zależy od serwera pocztowego, serwera WWW, etc). Przetestuj go i dostosuj odpowiednio ustawienie 'HttpContext.Server.ScriptTimeout'. –

0

Można obsługiwać przepływ pracy systemu Windows lub usługę Windows. i skonfiguruj kolejkę komunikatów do przetwarzania tych zdarzeń. Możesz po prostu użyć bazy danych dla swojej kolejki komunikatów lub możesz użyć kolejki komunikatów ms lub użyć wyzwalaczy w bazie danych. Ale tego rodzaju funkcjonalność naprawdę nie powinna być obowiązkiem twojej frontowej aplikacji internetowej. Jeśli dojdzie do pchnięcia, możesz odrodzić się z innego wątku w twojej aplikacji asp.net, aby przetworzyć kolejkę.

0

Brzmi jak zadanie dla usługi lub zaplanowane zadania.

Nie chcesz tego robić w środowisku ASP.NET, ponieważ musisz skonfigurować usługi IIS, aby cały czas utrzymywać swoją aplikację przy życiu, co może nie być najlepszym pomysłem.

Zaplanowane zadanie jest w porządku, ale będziesz musiał zaprogramować go z całą logiką do analizy danych. Nie najlepszy do rozdzielenia obaw. Musisz również zaktualizować dwie bazy kodu, jeśli coś się zmieni.

Usługa nie jest idealna, ponieważ byłoby to tylko naprawdę coś robić raz dziennie. Możesz jednak skonfigurować usługę wcf i umieścić w kolejce wiadomości e-mail za pomocą usługi.

4

chciałbym mieć wszystkie swoje e-maile, powiadomienia itp zapisane do DB/stołu, a potem mają usługę ankiety dla nowych zapisów w ta baza danych lub tabela obsługująca faktyczne wysyłanie wiadomości e-mail/powiadomienia.

Aby zająć się konkretnymi sytuacjami, kontrolery mogą zapisywać dane do bazy danych, gdy wymagany jest adres e-mail/powiadomienie, a usługa, która wykonuje sprawdzanie dotyczące interwałów/zdarzeń, zapisuje również dane do bazy danych w celu utworzenia nowej wiadomości e-mail. W ten sposób twoja aplikacja i usługa nie dbają o to, jak i co dzieje się z tymi powiadomieniami, po prostu mówią: "Hej, zrób coś". a usługa e-mail/powiadomienie faktycznie wykonuje implementację.

Zaletą tego jest to, że jeśli dostawca poczty e-mail nie działa, nie zgubisz żadnych wiadomości e-mail i masz historię wszystkich e-maili wysłanych wraz z ich danymi o tym, kiedy, kto, itd ... Możesz też wyrwać lub zmień adres e-mail, aby zrobić więcej, np. wysłać na Twittera lub wiadomość tekstową telefonu itp. To skutecznie oddziela twoje powiadomienia od aplikacji.

Wszystkie wnioski, jakie dokonane niedawno korzystać z tego typu modelu i zatrzymał maile przed utratą z powodu awarii usługowych i innych powodów. Umożliwiło to również wyszukiwanie wszystkich wiadomości e-mail, które przeszły przez system, i uzyskiwanie danych, które pozwalają mi zoptymalizować potrzebę wysyłania wiadomości e-mail, przechowując dodatkowe informacje w rekordzie e-mail, takie jak wysłana przyczyna, jeśli ma zgłosić błąd itp. .. Dodawanie dodatków, takich jak powiadomienia o rutingu (np. Przejście do wiadomości tekstowej zamiast wiadomości e-mail) w oparciu o porę dnia lub użytkownika, było możliwe bez żadnych zmian w podstawowej aplikacji.

Twój klient może pomyśleć, wszyscy potrzebujemy email dzisiaj, ale należy upewnić się, że rozwiązanie jest na tyle elastyczne, aby umożliwić bardziej niż po prostu napisz w przyszłości z tylko niewielkimi tweeks.

+0

W kwestii śledzenia i archiwizacji wysłanych powiadomień .... jeśli oprócz wszystkich innych kanałów transmisji (e-mail, twitter, i inni), tworzysz adres e-mail Google Apps, loguj wszystkie transakcje, skorzystaj z wyszukiwarki Google. Wyszukując nic więcej niż numer zamówienia, otrzymujesz wszystkie powiązane transakcje. Zastosuj proste filtrowanie i uzyskaj naprawdę interesujące możliwości - umieść odpowiednie linki w tych "e-mailach" i możesz połączyć je z cms lub podsystemami raportowania aplikacji. – justSteve