2013-03-13 3 views
6

В моем текущем проекте есть необходимость запланировать метод, который будет выполняться с установленными интервалами, например. раз в неделю, и в настоящее время это делается с помощью службы Windows, создающей HttpClient и использующей желаемый метод контроллера.Планирование веб-метода Api для запуска с заданными интервалами

Мне было интересно, возможно ли автоматизировать сам проект Web Api, а не использовать внешнюю службу. До сих пор я не нашел никакой документации по этому поводу.

Извините, что у меня нет образца кода для работы, поскольку я еще не нашел базу для начала.

ответ

2

Это не то, что вы хотите, чтобы веб-API работал, и я не думаю, что это так. Что-то о единых обязанностях.

Что не так с сервисным подходом? Вы также можете взглянуть на планировщик задач Windows.

+0

Это то, что я думал. Кто-то подумал, что если этот метод будет работать долго, тогда могут возникнуть проблемы с тайм-аутами, с которыми он обращается к HttpClient – Thewads

+0

@ Thewads, поэтому метод службы, который вы хотите выполнить, содержит некоторую бизнес-логику. Если вы извлекаете эту логику в отдельную библиотеку, вы можете получить доступ к ней из другого места, например, в библиотеку Windows Service. Тогда вам не придется иметь дело с таймаутами. – CodeCaster

+0

Это был другой вариант, который я рассматривал также как – Thewads

3

Внутри веб-Api нет никакого способа добиться желаемого. В любом случае, Web Apis должен быть апатридом.

Вы можете теоретически создать долгосрочную задачу на своем веб-сервере для периодического вызова своего Api (или метода напрямую), лучшим способом разместить такой метод будет метод OnStart в вашем глобальном файле asax. Однако этот метод запускается, когда веб-сервер загружается в домен приложения, и задача будет уничтожена, когда веб-сервер решит выгрузить ваше приложение. Поэтому, если вы хотя бы один раз не вызываете свой веб-сервер, ваша задача не будет запущена. И если ваш веб-сервер не будет получать доступ периодически, ваша задача будет убита.

Наличие внешнего надежного ресурса, такого как ваш сервис, по-прежнему является лучшим и безопасным подходом.

8

Если вам нужно запланировать фоновое задание для запуска каждую неделю, вы можете использовать (NuGet link), чтобы запустить его для вас. Вы можете сделать что-то вроде этого:

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

Update Новая версия FluentScheduler слегка изменила API. Теперь задача должна быть взята из IJob, а не из ITask. Обновлен мой пример, чтобы отразить это.

+0

Я реализовал это, но не работал с WebAPI 2.0 Любое предложение или рекомендации? –

+0

@SohailAhmad Вы получаете какие-либо ошибки? Пробовали ли вы установить контрольную точку в 'Execute()', чтобы увидеть, если она попала? Измените задачу на каждые 5 секунд, чтобы увидеть, работает ли она. – Ionian316

+1

Не было никакой ошибки, я пытался отладить и заметил, что метод Execute() не был вызван, и после некоторого поиска в Google я сделал это с этим «JobManager.AddJob (() => scheduler.SendTaskRemainderNotification(), s => s.WithName ("[TaskRemainder]"). ToRunNow(). AndEvery (1) .Days()); –