У меня есть служба Windows, которая берет название набора файлов, и сделайте операции на них (архивируйте/разархивируйте, обновив дб и т.д.). Операции могут занять время в зависимости от размера и количества файлов, отправленных сервису.
(1) Модуль, который отправляет запрос к этому сервису, ожидает, пока файлы не обрабатываются. Я хочу знать, существует ли способ обеспечить обратный вызов в сервисе, который уведомит модуль вызова, когда он будет закончен, обрабатывая файлы. Обратите внимание на то, что несколько модулей могут назвать сервис за один раз для обработки файлов, таким образом, сервис должен будет обеспечить некоторый TaskId, я предполагаю.
(2) Если сервисный метод называют и работает, и другой вызов выполняется к тому же сервису, то, как это будет звонить, обрабатываются (я думаю, что существует только один поток, связанный с сервисом). Я видел, что, когда сервис занимает время в обработке метода, потоки, связанные с сервисом, начинают увеличиваться.
WCF действительно предлагает дуплексные привязки, которые позволяют указать контракт обратного вызова , чтобы служба могла перезвонить вызывающему клиенту для уведомления.
Однако, на мой взгляд, этот механизм довольно ненадежен, и его не стоит рекомендовать.
В таком случае, когда вызов вызывает довольно длительную операцию, я бы сделал что-то вроде этого:
Если вы хотите придерживаться привязок HTTP / NetTcp, я бы:
Итак, в вашем случае вы можете отказаться от просьба заархивировать некоторые файлы. Служба отключится, выполнит свою работу и сохранит полученный ZIP-файл во временном месте. Затем позже клиент может проверить, готов ли ZIP-файл, и, если да, получить его.
Это работает даже лучше с очередью сообщений (MSMQ), которая присутствует на каждом сервере Windows (но, похоже, не многие люди знают об этом или используют его):
Узнайте, как чтобы сделать все это эффективно, прочитав отличную статью MSDN Foudnations: Создайте очередь WCF Response Service - настоятельно рекомендуется!
На мой взгляд, системы на основе очереди сообщений имеют тенденцию быть гораздо более стабильными и менее подверженными ошибкам, чем системы на основе дуплексного / обратного вызова.
(1) Самый простой способ добиться этого - использовать taskId, как вы заметили, а затем использовать другой метод под названием IsTaskComplete, с помощью которого клиент может проверить, завершена ли задача.
(2) Дополнительные вызовы службы запускают новые потоки.
edit: поведение службы по умолчанию - запускать новые потоки при каждом вызове. Настраиваемое свойство - Instance Context Mode , и может быть установлено на PerCall, PerSession или Shareable.