Веб-сервис и опрос

Я хотел бы реализовать WebService, содержащий метод, ответ которого будет задержан менее чем на 1 секунду до примерно часа (это зависит от того, кэшированы ли данные или их нужно получить).

В основном мой вопрос заключается в том, как лучше всего реализовать это, если вы можете подключаться только от клиента к веб-службе (без возможности уведомления)?

Насколько я знаю, это возможно только при использовании какого-либо опроса. Но опрос — это плохо, поэтому я бы предпочел не использовать его. Другая крайность может заключаться в том, чтобы просто позволить соединению оставаться открытым до тех пор, пока метод не будет выполнен. Но я предполагаю, что это может привести к замедлению работы веб-сервера и сети. Я подумывал совместить эти две техники. Затем клиент вызовет метод, и сервер вернется через не менее 10 секунд либо с сообщением о том, что клиенту необходимо повторить опрос, либо с фактическим результатом.

Что ты думаешь?


person Martin    schedule 28.01.2009    source источник


Ответы (5)


Возможно, вы захотите взглянуть на комету.

person krosenvold    schedule 28.01.2009
comment
Спустя годы вам захочется взглянуть на стандартизированную форму кометы под названием WebSockets. Реализация .NET доступна по адресу SuperWebSocket. - person ladenedge; 30.09.2012

Я бы предложил своего рода интеллектуальный опрос, если это возможно:

  • При первом запросе верните токен для представления запроса. Это то, что будет представлено в будущих запросах, поэтому легко проверить, действительно ли этот запрос выполнен.
  • При будущих запросах держите соединение открытым в течение определенного времени (например, минуты, возможно, указанной на клиенте) и возвращайте либо результат, или результат "все еще нет результатов; повторите попытку в точке X ", где X — это наилучшее из имеющихся у вас предположений о том, когда ответ будет завершен.

Преимущества:

  • Вы позволяете клиенту использовать модель «удерживать соединение открытым», которая является относительно дорогой (с точки зрения соединений), но позволяет обслуживать ответ, как только он будет готов. Убедитесь, что вы не держитесь за нить при каждом соединении! (И иметь какое-то ограничение по времени...)
  • Указав, когда клиент должен вернуться, вы можете внедрить политику отсрочки — даже если вы не знаете, когда она будет готова, у вас может быть «отсрочка на 1, 2, 4, 8, 16, 30, 30, 30, 30..." минут политики. (Возможно, вам следует убедиться, что клиент не игнорирует это.) Вы не получите массу бесполезных опросов из-за длинных промахов, но вы все равно быстро получите быстрые результаты.
person Jon Skeet    schedule 28.01.2009

Я думаю, что для чего-то, что может занять час, чтобы ответить веб-службе, это не лучший механизм для использования.

Почему голосование плохо? Конечно, если вы отрегулируете частоту опроса, это будет не так плохо. Предварительно удвойте время между опросами, максимум около пяти минут.

person Jeremy French    schedule 28.01.2009

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

person gkrogers    schedule 28.01.2009

На IIS и на стороне клиента есть тайм-ауты, которые не позволят вам оставить соединение открытым. Это также нецелесообразно, потому что ресурсы/соединения заблокированы на сервере.

Почему вы хотите, чтобы пользователь ждал такой долгой задачи? Пусть поищут где-нибудь статус операции.

person Louis Haußknecht    schedule 28.01.2009