Служба Windows WCF - Долгие операции/Обратный вызов к вызову модуля

У меня есть служба Windows, которая берет название набора файлов, и сделайте операции на них (архивируйте/разархивируйте, обновив дб и т.д.). Операции могут занять время в зависимости от размера и количества файлов, отправленных сервису.

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

(2) Если сервисный метод называют и работает, и другой вызов выполняется к тому же сервису, то, как это будет звонить, обрабатываются (я думаю, что существует только один поток, связанный с сервисом). Я видел, что, когда сервис занимает время в обработке метода, потоки, связанные с сервисом, начинают увеличиваться.

10
задан A9S6 8 March 2010 в 09:16
поделиться

2 ответа

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

Однако, на мой взгляд, этот механизм довольно ненадежен, и его не стоит рекомендовать.

В таком случае, когда вызов вызывает довольно длительную операцию, я бы сделал что-то вроде этого:

Если вы хотите придерживаться привязок HTTP / NetTcp, я бы:

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

Итак, в вашем случае вы можете отказаться от просьба заархивировать некоторые файлы. Служба отключится, выполнит свою работу и сохранит полученный ZIP-файл во временном месте. Затем позже клиент может проверить, готов ли ZIP-файл, и, если да, получить его.

Это работает даже лучше с очередью сообщений (MSMQ), которая присутствует на каждом сервере Windows (но, похоже, не многие люди знают об этом или используют его):

  • ваш клиент отбрасывает запрос на очередь запросов
  • служба прослушивает эту очередь запросов и выбирает запрос за запросом и работает ли
  • служба может затем отправить результаты в очередь результатов, которую, в свою очередь, прослушивают ваши вызывающие абоненты

Узнайте, как чтобы сделать все это эффективно, прочитав отличную статью MSDN Foudnations: Создайте очередь WCF Response Service - настоятельно рекомендуется!

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

14
ответ дан 3 December 2019 в 21:59
поделиться

(1) Самый простой способ добиться этого - использовать taskId, как вы заметили, а затем использовать другой метод под названием IsTaskComplete, с помощью которого клиент может проверить, завершена ли задача.

(2) Дополнительные вызовы службы запускают новые потоки.

edit: поведение службы по умолчанию - запускать новые потоки при каждом вызове. Настраиваемое свойство - Instance Context Mode , и может быть установлено на PerCall, PerSession или Shareable.

1
ответ дан 3 December 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: