2015-04-28 2 views
0

Фон: У нас есть функции импорта, которые могут занять от нескольких секунд до 1-2 часов для запуска в зависимости от импортируемого файла. Мы хотим открыть новый способ запуска импорта через запрос REST.Как обрабатывать ответ для долгосрочного запроса REST?

В идеале служба REST будет вызываться, запускать импорт и отвечать с результатом, когда это будет сделано. Мой вопрос: поскольку для запуска может занять до двух часов, можно ли ответить или будет ли время ожидания запроса для вызывающего? Есть ли лучший способ для такого рода операций?

+0

Общим шаблоном для этого является запуск процесса на сервере, сообщение идентификатора клиенту и периодический контроль клиента за состоянием процесса. Если вы хотите, вы можете реализовать какое-то push-уведомление для вашего приложения. – germi

+1

ASP.NET уже предоставляет сигнализацию через SignalR. –

ответ

1

Существует несколько подходов, описанных здесь. Надеемся, это даст вам отправную точку: http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html

+0

Какой? Как правило, это плохая форма для публикации ссылки без каких-либо объяснений. В этом конкретном случае в статье рассматриваются несколько методов, каждый из которых подходит для разных сценариев. Просто отправить ссылку не помогает –

+0

Спасибо за отзыв Panagiotis - все еще учится. –

1

То, что я использую в этих случаях, является асинхронной операцией, которая не возвращает результат (результат функции void в случае веб-API C#), а затем посылает результат асинхронно, используя очередь сообщений.

E.g.

[HttpPut] 
[Route("update")] 
public void Update() 
{ 
    var task = Task.Run(() => this.engine.Update()); 
    task.ContinueWith(t => publish(t, "Update()")); 
} 
+1

1) SignalR уже предоставляет уведомления клиентов с использованием длинных опросов, веб-сокетов или бесконечных кадров. 2) Вы не должны * использовать задачи «огонь и забыть» для этого, так как IIS может убить их в любое время, если они не знают о них. По крайней мере, вам необходимо их зарегистрировать. 2-часовая работа, хотя просто не должна обрабатываться IIS, поскольку она болит в масштабируемости –

+0

@PanagiotisKanavos 1) OP не упомянул, что использует SignalR, и обмен сообщениями может быть реализован по-разному (например, SignalR, Message Queue), в зависимости от по его требованиям (которые он не опубликовал). 2) 2-часовая работа - не лучшая практика, однако вы можете предотвратить ежедневную переработку и простаивать, тем самым предотвращая ее от убийства. Лучшей практикой было бы разделить работу на небольшие рабочие места и возобновить их. –

Смежные вопросы