Heute haben wir eine Konsolenanwendung zum Ausführen der geplanten Aufgaben für unsere ASP.NET-Website erstellt. Aber ich denke, dieser Ansatz ist etwas fehleranfällig und schwer beizubehalten. Wie führen Sie Ihre geplante Aufgabe aus (in einer Windows / IIS / ASP.NET-Umgebung)?
Aktualisieren:
Beispiele für Aufgaben:
- Senden von E-Mails aus einer E-Mail-Warteschlange in der Datenbank
- Veraltete Objekte aus der Datenbank entfernen
- Abrufen von Statistiken aus Google AdWords und Ausfüllen einer Tabelle in der Datenbank.
asp.net
windows
iis
scheduled-tasks
Niels Bosma
quelle
quelle
Antworten:
Alle meine Aufgaben (die geplant werden müssen) für eine Website werden auf der Website gespeichert und von einer speziellen Seite aus aufgerufen. Ich habe dann einen einfachen Windows-Dienst geschrieben, der diese Seite von Zeit zu Zeit aufruft. Sobald die Seite ausgeführt wird, wird ein Wert zurückgegeben. Wenn ich weiß, dass noch mehr Arbeit zu erledigen ist, starte ich die Seite sofort erneut, andernfalls starte ich sie in kurzer Zeit. Dies hat bei mir sehr gut funktioniert und behält meine gesamte Aufgabenlogik mit dem Webcode bei. Vor dem Schreiben des einfachen Windows-Dienstes habe ich die Seite alle x Minuten mit dem Windows-Scheduler aufgerufen.
Eine andere bequeme Möglichkeit, dies auszuführen, ist die Verwendung eines Überwachungsdienstes wie Pingdom . Zeigen Sie mit der http-Prüfung auf die Seite, auf der Ihr Servicecode ausgeführt wird. Lassen Sie die Seite Ergebnisse zurückgeben, die dann verwendet werden können, um Pingdom zum Senden von Warnmeldungen auszulösen, wenn etwas nicht stimmt.
quelle
Diese Technik von Jeff Atwood für Stackoverflow ist die einfachste Methode, die mir begegnet ist. Es basiert auf dem Rückrufmechanismus "Cache-Element entfernt", der in das Cache-System von ASP.NET integriert ist
Update: Stackoverflow ist dieser Methode entwachsen. Es funktioniert nur, während die Website ausgeführt wird, aber es ist eine sehr einfache Technik, die für viele Menschen nützlich ist.
Schauen Sie sich auch Quartz.NET an
quelle
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Jeff AtwoodErstellen Sie einen benutzerdefinierten Windows-Dienst .
Ich hatte einige geschäftskritische Aufgaben als geplante Konsolen-Apps eingerichtet und fand sie schwierig zu warten. Ich habe einen Windows-Dienst mit einem Herzschlag erstellt, der alle paar Minuten einen Zeitplan in meiner Datenbank überprüft. Es hat wirklich gut geklappt.
Trotzdem verwende ich für die meisten meiner unkritischen Wartungsaufgaben weiterhin geplante Konsolen-Apps. Wenn es nicht kaputt ist, reparieren Sie es nicht.
quelle
Ich habe festgestellt, dass dies für alle Beteiligten einfach ist:
Mit dieser Methode ist die gesamte Geschäftslogik in Ihrer Webanwendung enthalten. Sie haben jedoch die Zuverlässigkeit des Windows-Task-Managers oder eines anderen kommerziellen Task-Managers, um diese zu starten und Rückgabeinformationen wie einen Ausführungsbericht aufzuzeichnen. Die Verwendung eines Webdienstes anstelle der Veröffentlichung auf einer Seite hat einen gewissen Vorteil, da es einfacher ist, Rückgabedaten von einem Webservice abzurufen.
quelle
Warum das Rad neu erfinden, verwenden Sie die Threading- und die Timer-Klasse.
quelle
Verwenden Sie Windows Scheduler, um eine Webseite auszuführen.
Um zu verhindern, dass böswillige Benutzer- oder Suchmaschinenspinnen sie ausführen, rufen Sie beim Einrichten der geplanten Aufgabe einfach die Webseite mit einem Querystring auf, dh: mypage.aspx? From = Scheduledtask
Verwenden Sie dann beim Laden der Seite einfach eine Bedingung: if (Request.Querystring ["from"] == "Scheduledtask") {// executeetask}
Auf diese Weise kann kein Suchmaschinen-Spider oder böswilliger Benutzer Ihre geplante Aufgabe ausführen.
quelle
Request.IsLocal
>> Nur der Server selbst kann die geplanten Aufgaben ausführen, sonst niemand.Diese Bibliothek funktioniert wie ein Zauber http://www.codeproject.com/KB/cs/tsnewlib.aspx
Sie können geplante Windows-Aufgaben direkt über Ihren .NET-Code verwalten.
quelle
Wenn Ihre Anwendung SQL SERVER verwendet, können Sie außerdem den SQL Agent verwenden, um Ihre Aufgaben zu planen. Hier setzen wir häufig wiederkehrenden Code ein, der datengesteuert ist (E-Mail-Erinnerungen, geplante Wartung, Bereinigung usw.). Eine großartige Funktion, die in den SQL Agent integriert ist, sind Optionen zur Fehlerbenachrichtigung, mit denen Sie benachrichtigt werden können, wenn eine kritische Aufgabe fehlschlägt.
quelle
Ich bin mir nicht sicher, welche Art von geplanten Aufgaben Sie meinen. Wenn Sie Aufgaben wie Aufgaben vom Typ "Jede Stunde, Aktualisierung von foo.xml" meinen, verwenden Sie das Windows-System "Geplante Aufgaben". (Der Befehl "at" oder über den Controller.) Lassen Sie ihn entweder eine Konsolen-App ausführen oder eine spezielle Seite anfordern, die den Prozess startet.
Bearbeiten: Ich sollte hinzufügen, dies ist eine gute Möglichkeit, um Ihre IIS-App auch an geplanten Punkten zum Laufen zu bringen. Angenommen, Sie möchten Ihre Datenbank alle 30 Minuten überprüfen und Benutzer per E-Mail an bestimmte Daten erinnern. Sie können geplante Aufgaben verwenden, um diese Seite anzufordern und damit IIS-Verarbeitungsaufgaben zu erhalten.
Wenn Ihre Anforderungen komplexer sind, können Sie einen Windows-Dienst erstellen und eine Schleife ausführen lassen, um die erforderliche Verarbeitung durchzuführen. Dies hat auch den Vorteil, dass der Code für Skalierungs- oder Verwaltungszwecke getrennt wird. Auf der anderen Seite müssen Sie sich mit Windows-Diensten befassen.
quelle
Wenn Sie den Server besitzen, sollten Sie den Windows-Taskplaner verwenden. Verwenden Sie AT /? über die Befehlszeile, um die Optionen anzuzeigen.
Andernfalls müssen Sie in einer webbasierten Umgebung möglicherweise etwas Unangenehmes tun, z. B. einen anderen Computer einrichten, um in einem bestimmten Zeitintervall Anforderungen an eine bestimmte Seite zu stellen.
quelle
Ich habe Abidar erfolgreich in einem ASP.NET-Projekt verwendet (hier einige Hintergrundinformationen ).
Das einzige Problem bei dieser Methode besteht darin, dass die Aufgaben nicht ausgeführt werden, wenn die ASP.NET-Webanwendung aus dem Speicher entladen wird (dh aufgrund geringer Nutzung). Ich habe versucht, alle 5 Minuten eine Aufgabe zu erstellen, um die Webanwendung aufzurufen und sie am Leben zu erhalten. Dies schien jedoch nicht zuverlässig zu funktionieren. Daher verwende ich jetzt stattdessen den Windows-Scheduler und die grundlegende Konsolenanwendung, um dies zu tun.
Die ideale Lösung ist das Erstellen eines Windows-Dienstes, obwohl dies möglicherweise nicht möglich ist (dh wenn Sie eine gemeinsam genutzte Hosting-Umgebung verwenden). Unter Wartungsgesichtspunkten ist es auch etwas einfacher, die Dinge in der Webanwendung zu halten.
quelle
Hier ist ein anderer Weg:
1) Erstellen Sie ein "Heartbeat" -Webskript, das für das Starten der Aufgaben verantwortlich ist, wenn diese fällig oder überfällig sind.
2) Erstellen Sie irgendwo einen geplanten Prozess (vorzugsweise auf demselben Webserver), der auf das Webskript trifft und es zwingt, es in regelmäßigen Abständen auszuführen. (z. B. Windows-Planungsaufgabe, die das Heatbeat-Skript leise mit IE oder whathaveyou startet)
Die Tatsache, dass der Aufgabencode in einem Web-Skript enthalten ist, dient lediglich dazu, den Code in der Codebasis der Webanwendung zu halten (die Annahme ist, dass beide voneinander abhängig sind), was für Webentwickler einfacher zu verwalten wäre .
Der alternative Ansatz besteht darin, ein ausführbares Serverskript / -programm zu erstellen, das den gesamten Zeitplan selbst ausführt, und die ausführbare Datei selbst als geplante Aufgabe auszuführen. Dies kann eine grundlegende Entkopplung zwischen der Webanwendung und der geplanten Aufgabe ermöglichen. Wenn Sie Ihre geplanten Aufgaben auch dann ausführen möchten, wenn die Webanwendung / Datenbank möglicherweise nicht verfügbar oder nicht erreichbar ist, sollten Sie diesen Ansatz wählen.
quelle
Mit der Methode 'ThreadPool.RegisterWaitForSingleObject' können Sie problemlos einen Windows-Dienst erstellen, der Code in Intervallen ausführt. Es ist wirklich schick und ziemlich einfach einzurichten. Diese Methode ist rationaler als die Verwendung eines der Timer im Framework.
Weitere Informationen finden Sie unter dem folgenden Link:
Ausführen eines periodischen Prozesses in .NET mithilfe eines Windows-Dienstes:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
quelle
Wir verwenden auch Konsolenanwendungen. Wenn Sie Protokollierungstools wie Log4net verwenden, können Sie deren Ausführung ordnungsgemäß überwachen. Ich bin mir auch nicht sicher, wie sie schwieriger zu warten sind als eine Webseite, da Sie möglicherweise einige der gleichen Codebibliotheken zwischen den beiden gemeinsam nutzen, wenn sie ordnungsgemäß entworfen wurden.
Wenn Sie dagegen sind, dass diese Aufgaben zeitgesteuert ausgeführt werden, befindet sich möglicherweise eine Webseite in Ihrem Verwaltungsbereich Ihrer Website, die als Warteschlange fungiert. Der Benutzer gibt eine Anforderung zum Ausführen der Aufgabe ein. Anschließend wird ein leerer Datenstempeldatensatz in die MyProcessQueue-Tabelle eingefügt, und Ihre geplante Aufgabe sucht alle X Minuten nach einem neuen Datensatz in MyProcessQueue. Auf diese Weise wird es nur ausgeführt, wenn der Kunde dies wünscht.
Hoffe, diese Vorschläge helfen.
quelle
Eine Möglichkeit wäre, einen Windows-Dienst einzurichten und diesen zum Aufrufen Ihrer geplanten Aufgabe zu veranlassen.
In Winforms, die ich mit Timern verwendet habe, glaube ich nicht, dass dies in ASP.NET gut funktionieren würde
quelle
Eine neue Task Scheduler-Klassenbibliothek für .NET
Hinweis: Seit diese Bibliothek erstellt wurde, hat Microsoft einen neuen Taskplaner (Task Scheduler 2.0) für Windows Vista eingeführt. Diese Bibliothek ist ein Wrapper für die Task Scheduler 1.0-Oberfläche, die in Vista weiterhin verfügbar ist und mit Windows XP, Windows Server 2003 und Windows 2000 kompatibel ist.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
quelle