ASP.NET Веб-API возвращает данные каждую секунду

#c# #asp.net #asp.net-web-api2

#c# #asp.net #asp.net-web-api2

Вопрос:

прежде всего, я прошу прощения за мой плохой заголовок вопроса, но я не могу придумать ничего лучше прямо сейчас.

То, что я хочу сделать, кажется довольно простым. Я хочу, чтобы мой API возвращал, например, простую строку каждую секунду примерно 10 раз.

Есть ли какой-либо способ достичь этого с ASP.NET ?

И да, очевидно, что фактический вариант использования отличается. Мой API очищает некоторые данные и возвращает их после этого. Проблема в том, что очистка занимает около 70 секунд. Я бы хотел, чтобы он возвращал данные в меньших пакетах, чтобы мое приложение могло начать обработку данных раньше.

Но способ достижения этого — если таковой существует — должен быть тем же самым. По крайней мере, я так об этом думаю.

Спасибо за любую помощь.

Комментарии:

1. Думайте в терминах HTTP. Вы ожидаете, что данные ответа будут передаваться в потоковом режиме для одного HTTP-запроса, или вы ожидаете, что ваш первый ответ завершится быстро, а затем клиент отправит другой запрос и т.д.? Можете ли вы вместо этого использовать веб-сокеты?

2. Хотя вы могли бы поддерживать выполнение запроса в течение более длительного периода и отправлять ответ порциями, ASP.NET API на самом деле не создан для этого варианта использования. Возможно, было бы лучше инициировать очистку через вызов API и использовать SignalR для отправки обновлений клиенту или даже вообще инициировать очистку через SignalR.

3. @JonSkeet Я хотел бы выполнить только один запрос. Я хотел бы, чтобы мой клиент был как можно более «тупым»…

4. @huysentruitw Не мог бы ты быть таким королем, чтобы объяснить это немного подробнее? Это кажется интересным…

5. Я подозреваю, что по-настоящему «тупой» клиент даже не захочет начинать обработку ответа, пока он не будет завершен. Хотя это может быть осуществимо, вы должны ожидать, что это будет неудобно — и что прокси-серверы могут легко испортить вам ситуацию, например, добавив буферизацию.

Ответ №1:

Это невозможно с http.

Вы должны создать длительный пул на стороне клиента или вы можете создать сокет-соединение между клиентом и сервером. Пакет signalr — отличный выбор.