2013-03-13 24 views
6

In meinem aktuellen Projekt muss eine Methode geplant werden, die in festgelegten Intervallen ausgeführt wird, z. einmal pro Woche, und dies geschieht derzeit über einen Windows-Dienst, der einen HttpClient erstellt und die gewünschte Controller-Methode trifft.Planen der Web-Api-Methode zur Ausführung bestimmter Intervalle

Ich frage mich, ob es möglich ist, im Web-API-Projekt selbst zu automatisieren, anstatt einen externen Dienst zu verwenden. Bisher habe ich keine Dokumentation darüber gefunden.

Entschuldigung dafür, dass ich kein Codebeispiel zur Verfügung habe, da ich noch keine Basis gefunden habe, von der ich starten könnte.

Antwort

2

Dies ist nicht etwas, das die Web-API tun soll, und ich glaube nicht, dass dies der Fall ist. Etwas über einzelne Verantwortlichkeiten.

Was ist falsch mit dem Service-Ansatz? Sie können auch einen Blick auf den Windows Taskplaner werfen.

+0

Das habe ich mir gedacht. Es gab einen Gedanken von jemandem, dass, wenn diese Methode lange läuft, es Probleme mit Timeouts geben könnte, auf die der HttpClient – Thewads

+0

@Thewads zugreift, so dass die Dienstmethode, die Sie ausführen möchten, eine Geschäftslogik enthält. Wenn Sie diese Logik in eine separate Bibliothek extrahieren, können Sie von einer anderen Bibliothek darauf zugreifen, z. B. von einer Windows-Dienstbibliothek. Dann müssen Sie sich nicht mit Timeouts herumschlagen. – CodeCaster

+0

das war die andere Option, die ich auch betrachtete – Thewads

3

Es gibt nicht wirklich einen Weg innerhalb der Web Api, um das zu erreichen, was Sie wünschen. Web Apis sollte sowieso staatenlos sein.

Sie könnten theoretisch eine langwierige Aufgabe auf Ihrem Webserver erstellen, um Ihre Api (oder die Methode) regelmäßig aufzurufen. Die beste Methode, eine solche Methode zu verwenden, wäre die OnStart-Methode in Ihrer globalen asax-Datei. Diese Methode wird jedoch ausgeführt, wenn der Webserver in die App-Domäne geladen wird, und die Aufgabe wird beendet, wenn der Webserver entscheidet, Ihre Anwendung zu entladen. Wenn Sie Ihren Webserver nicht mindestens einmal aufrufen, wird Ihre Aufgabe nicht gestartet. Und wenn Ihr Webserver nicht regelmäßig Zugriff hat, wird Ihre Aufgabe beendet.

Eine externe zuverlässige Ressource, wie z. B. Ihr Service, ist immer noch der beste und sicherste Ansatz.

8

Wenn Sie eine Hintergrundaufgabe planen müssen jede Woche laufen, können Sie FluentScheduler (NuGet link) verwenden Sie es für Sie ausführen. Sie können etwas tun:

public class WeeklyRegistry : Registry 
{ 
    public WeeklyRegistry() 
    {    
     Schedule<WeeklyTask>().ToRunEvery(1).Weeks(); // run WeeklyTask on a weekly basis   
    } 
} 

public class WeeklyTask : IJob 
{ 
    public void Execute() 
    {    
     // call the method to run weekly here 
    } 
} 

aktualisieren Die neue Version von FluentScheduler leicht die API geändert. Die Aufgabe sollte nun von IJob und nicht von ITask abgeleitet werden. Mein Beispiel wurde aktualisiert, um dies zu berücksichtigen.

+0

Ich implementierte dies, aber es funktioniert nicht mit WebAPI 2.0 Irgendwelche Vorschläge oder Empfehlungen? –

+0

@SohailAhmad Erhalten Sie irgendwelche Fehler? Haben Sie versucht, in 'Execute()' einen Haltepunkt zu setzen, um zu sehen, ob er getroffen wird? Ändern Sie die Aufgabe so, dass sie alle 5 Sekunden ausgeführt wird, um zu sehen, ob sie funktioniert. – Ionian316

+1

Es gab keinen Fehler, ich habe versucht, zu debuggen und bemerkte, Execute() -Methode wurde nicht aufgerufen, und nach einigem googeln habe ich dies mit dieser 'JobManager.AddJob (() => scheduler.SendTaskRemainderNotification() s => s.WithName ("[TaskRemainder]"). ToRunNow(). AndEvery (1) .Days()); ' –

Verwandte Themen