Zeitbasierte Ereignisse in ASP.net

9

Ich muss einige Ereignisse basierend auf der Zeit durchführen (E-Mails senden usw.). Was ist der beste Weg, dies in ASP.net in einer gehosteten (Medium Trust) Umgebung zu erreichen?

ex: Senden Sie jeden Tag um 16:00 Uhr eine E-Mail.
ex: Senden Sie eine E-Mail nach 15 Minuten Login.
ex: Senden Sie eine E-Mail nach 10 Stunden der letzten Änderung an den Status.

Die Auslöselogik kann bei einigen Anforderungen sehr komplex sein. Daher muss ich ein flexibles System für diese Art von Ereignissen erstellen. Ich bleibe bei der Kernaktivierungsmethode für diesen Code stecken.

Hier sind die Optionen, die ich bisher hatte ...

1) Timer in Global.asax
   + Einfaches
   - Ist nicht zuverlässig, kann die Webanwendung in IIS entladen und das Ereignis wird nicht ausgelöst.
   ? Verwenden Sie eventuell einen externen Ping-Service, um die App am Leben zu halten (zuverlässig?)

2) Windows-Dienst zum Ausführen einer Aktion
   - Beleg / Pflegen separaten Code.
   - Installation in einer gehosteten Umgebung (Shared / Cloud Hosting) nicht möglich.

3) Windows-Dienst zum Aufrufen der Web App (ruft Webservice oder Seite runs auf)
   + Alle Codes in der Web-App
   - Kann nicht in einer gehosteten Umgebung installiert werden.

4) SQL Server Job zum Aufruf eines Webservice (über CLR)
   ? Habe das nicht geschaut .. möglich? zuverlässig in gehosteten Umgebungen?

5) SQL Service Broker Timer zum Hinzufügen einer Nachricht zum Aufruf von WebService (über CLR)
   ? Habe das nicht geschaut .. möglich? zuverlässig in gehosteten Umgebungen?

6) Windows Workflow?
   ? No Idea .. hat diese Technologie etwas dafür?

Das scheint ein allgemein genug Problem, gibt es Third-Party-Tools, um damit umzugehen?

    
Samg 03.06.2009, 16:25
quelle

5 Antworten

1

Ich hatte das gleiche Problem und stimme Ihrer Analyse vollkommen zu. Meine beste Lösung ist eine externe Terminierungsanwendung in einem Computer, den ich kontrolliere; Diese Anwendung fordert die Webseite an, die die Dinge tatsächlich erledigt.

Hässlich, aber es funktioniert, und ich habe nach anderen Lösungen gesucht, glauben Sie mir!

    
tekBlues 03.06.2009 16:29
quelle
1

Ich würde empfehlen, SQL Server-Jobs zu verwenden.

Es hat alle Zeitpläne, die in Ihrer Lösung benötigt werden, es ist auch sehr zuverlässig und kann mit C # -Code erweitert werden.

    
Jack Spektor 12.11.2012 08:15
quelle
1

Der einfachste Weg, eine geplante Aufgabe in Windows einzurichten, indem Sie eine einfache Konsolen-App oder Batch-Datei ausführen. Ссылка

Zu tun, worüber Sie in IIS sprechen, hat Probleme. Lesen Sie Phil Haacks Beitrag auf The Gefahren der Implementierung wiederkehrender Hintergrundaufgaben in ASP.NET

    
Nicholas Carey 15.08.2013 16:50
quelle
0

Haben Sie sich den Quartz-Scheduler angeschaut? Es ist ein .Net-Port der Java-Version. Siehe diesen ersten Artikel Ссылка .

Wir verwenden auch Azure und verwenden für die geplanten Aufgaben Mitarbeiterrollen. In diesem Artikel erfahren Sie, wie Sie grundlegende geplante Aufgaben mit Azure-Arbeitsrollen erstellen Ссылка

In der Vergangenheit haben wir auch eine Webseite eingerichtet, die die Aufgabe aufruft und einen Dienst wie Ссылка verwendet, um die Seite auf a aufzurufen geplante Basis.

    
GraemeMiller 12.11.2012 09:00
quelle
0

Wenn Sie wirklich ASP.NET verwenden möchten, würde ich eine Kombination aus SQL Server-, WCF- und ASP.NET-Caching verwenden, um Ihre geplanten Aufgaben auszuführen. Sie können es leicht ändern, um kürzere oder längere Intervalle (z. B. stündlich oder wöchentlich) zu machen. Dieser wird nur tägliche Aufgaben zu einem ausgewählten Zeitpunkt tun.

1. Richten Sie eine SQL-Tabelle für Ihre Aufgaben ein

%Vor%

2. Fügen Sie einige Daten zur Tabelle hinzu

%Vor%

Das Intervall teilt dem Server im Prinzip mit, wie oft die Zeit überprüft werden soll. Je kürzer die Zeit ist, desto genauer wird die Laufzeit, da die Datenbank öfter überprüft werden muss.

3. Wenn Sie ein ORM verwenden, erstellen Sie eine Klassenzuordnung

%Vor%

Dies verwendet fließendes Nhibernat. Entity Framework funktioniert auch großartig.

4. Erstellen Sie Serviceaufrufe zum Abrufen / Speichern der Aufgaben

%Vor%

Dies verwendet WCF für die Serviceaufrufe. Technisch gesehen benötigen Sie keinen Webdienst, aber ich denke, es hilft bei der Organisation, wenn Sie Ihre Datenbankabfragen von Ihrer ASP.NET-Site trennen.

5. Richten Sie die Planung in Ihrer Datei global.asax

ein %Vor%

Die obige Funktion greift grundsätzlich alle Aufgaben auf und führt sie durch einen Caching-Zyklus.

%Vor%

Die obige Funktion fügt jeden Task in der Datenbank dem ASP.NET-Laufzeitcache hinzu, der basierend auf dem in der Datenbank angegebenen Intervall eine Schleife durchläuft.

%Vor%

Wenn unser Intervall abläuft, wird die obige Funktion aufgerufen, die unsere Aufgabe ausführt.

6. Erstellen Sie die Funktion, die die Logik Ihrer verschiedenen Aufgaben ausführt

%Vor%

Insgesamt funktioniert diese Lösung in Anbetracht der vielen Verbesserungen, die damit gemacht werden können, anständig. Das App-Pool-Recycling sollte diese Lösung nicht beeinträchtigen, wenn Ihr Intervall relativ niedrig ist, seit der letzte Ausführungsstatus in der Datenbank gespeichert ist.

    
ROFLwTIME 15.08.2013 16:39
quelle