2013-03-13 21 views
6

W moim bieżącym projekcie istnieje potrzeba zaplanowania metody uruchamiania w określonych odstępach czasu, np. raz w tygodniu, a obecnie odbywa się to za pośrednictwem usługi windows, tworząc HttpClient i uderzając w pożądaną metodę kontrolera.Planowanie metody Web Api do pracy w określonych odstępach czasu

Zastanawiam się, czy jest to możliwe do zautomatyzowania w projekcie Web Api, zamiast korzystania z usługi zewnętrznej. Do tej pory nie znalazłem żadnej dokumentacji na ten temat.

Przepraszamy za nieposiadanie próbki kodu do pracy, ponieważ nie znalazłem jeszcze podstawy do rozpoczęcia.

Odpowiedz

2

To nie jest coś, co ma być zrobione przez Web API i nie sądzę, że tak. Coś o pojedynczych obowiązkach.

Co jest nie tak z podejściem serwisowym? Możesz również rzucić okiem na Harmonogram zadań Windows.

+0

Oto, co myślałem. Ktoś pomyślał, że jeśli ta metoda będzie długo działała, mogą wystąpić problemy z przekroczeniem limitu czasu, ponieważ jest ona dostępna dla HttpClient – Thewads

+0

@ Thewads, więc metoda usługi, którą chcesz wykonać, zawiera pewną logikę biznesową. Jeśli wyodrębnisz tę logikę do oddzielnej biblioteki, możesz uzyskać do niej dostęp z innego miejsca, na przykład z biblioteki usług systemu Windows. Wtedy nie musisz zajmować się limitami czasu. – CodeCaster

+0

to była inna opcja, na którą patrzyłem – Thewads

3

W sieci Web Api nie ma naprawdę sposobu na osiągnięcie tego, czego pragniesz. Web Apis i tak powinien być bezpaństwowcem.

Teoretycznie możesz utworzyć długo działające zadanie na swoim serwerze sieciowym, aby okresowo wywoływać Api (lub metodę bezpośrednio), najlepszym miejscem do umieszczenia takiej metody będzie metoda OnStart w twoim globalnym pliku asax. Jednak ta metoda jest uruchamiana, gdy serwer WWW jest ładowany do domeny aplikacji, a zadanie zostanie zabite, gdy serwer WWW zdecyduje się zwolnić aplikację. Więc jeśli nie zadzwonisz na swój serwer WWW co najmniej raz, twoje zadanie nie zostanie uruchomione. A jeśli twój serwer sieciowy nie ma dostępu okresowo, twoje zadanie zostanie zabite.

Posiadanie zewnętrznego niezawodnego zasobu, takiego jak usługa, jest nadal najlepszym i najbezpieczniejszym podejściem.

8

Jeśli chcesz zaplanować uruchamianie zadania w tle co tydzień, możesz użyć usługi FluentScheduler (NuGet link), aby uruchomić ją za Ciebie. Można zrobić coś takiego:

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 
    } 
} 

Aktualizacja Nowa wersja FluentScheduler API zmienił się nieznacznie. Zadanie powinno teraz pochodzić z IJob, a nie z programu ITask. Zaktualizowałem mój przykład, aby to odzwierciedlić.

+0

Zaimplementowałem to, ale nie działa z WebAPI 2.0 Jakieś sugestie lub zalecenia? –

+0

@SohailAhmad Czy otrzymujesz jakieś błędy? Czy próbowałeś ustawić punkt przerwania w 'Execute()', aby sprawdzić, czy jest on trafiony? Zmień zadanie tak, aby było uruchamiane co 5 sekund, aby sprawdzić, czy działa. – Ionian316

+1

Nie było żadnego błędu, próbowałem debugować i zauważyłem, że metoda Execute() nie została wywołana i po jakimś procesie googlowania, zrobiłem to z tym "JobManager.AddJob (() => scheduler.SendTaskRemainderNotification(), s => s.WithName ("[TaskRemainder]") ToRunNow(). AndEvery (1) .Days()); ' –

Powiązane problemy