WCF действительно предлагает дуплексные привязки, которые позволяют указать контракт обратного вызова, чтобы служба могла перезвонить вызывающему клиенту для уведомления.
Однако, на мой взгляд, этот механизм довольно ненадежен и не рекомендуется.
В таком случае, когда вызов вызывает довольно длительную операцию, я бы сделал что-то вроде этого:
Если вы хотите придерживаться привязок HTTP / NetTcp, я бы:
- сбросьте запрос со службой, а затем «отпустите» - это будет односторонний вызов, вы просто отбросите то, что хотите сделать, и тогда ваш клиент завершит работу
- имеет статусный вызов, по которому клиент может позвонить через определенное время, чтобы выяснить, готовы ли к настоящему моменту результаты запроса
- если они есть, должен быть третий сервисный вызов для получения результатов
Так что в вашем случае вы можете оставить запрос на сжатие некоторых файлов. Служба отключится, выполнит свою работу и сохранит полученный ZIP во временном местоположении. Затем клиент может проверить, готов ли ZIP, и если да, извлечь его.
Это работает даже лучше в очереди сообщений (MSMQ), которая присутствует на каждом компьютере с Windows-сервером (но, похоже, не многие знают об этом или используют его):
- ваш клиент отбрасывает запрос в очереди запросов
- служба прослушивает эту очередь запросов и получает запрос после запроса и работает ли она
- служба может затем отправить результаты в очередь результатов, в которой ваши абоненты, в свою очередь, прослушивают
Узнайте, как сделать все это эффективно, прочитав отличную статью MSDN. Обращения: Создайте службу ответов WCF для очереди - настоятельно рекомендуется!
Системы, основанные на очереди сообщений, имеют тенденцию быть намного более стабильными и менее подверженными ошибкам, чем система, основанная на дуплексном / обратном вызове, на мой взгляд.