#wcf
#wcf
Вопрос:
У меня есть операция службы WCF, и я хочу, чтобы вызов операции запускал долго работающий метод, однако я хочу, чтобы операция возвращала свой результат ДО завершения работы долго работающего метода.
Я пытался использовать реализацию IParameterInspector, но результат операции не возвращается клиенту до тех пор, пока долго работающий метод не завершится.
Как мне добиться этого, поскольку все, что я начинаю с операции, похоже, должно завершиться до того, как результат будет возвращен клиенту?
Спасибо.
Ответ №1:
Если вы хотите выполнить это на сервере, взгляните на http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/17/wcf-extensibility-ioperationinvoker.aspx показано, как обойти операцию (это сценарий кэширования, но его можно адаптировать к вашей проблеме).
Если вы хотите выполнить это на клиенте, вы можете просто вызвать операцию асинхронно, она сразу же вернется. И когда длительная операция завершится, вы получите уведомление (обратный вызов или событие) о том, что ее результаты готовы.
Комментарии:
1. Это интересный и жизнеспособный подход. Я предполагаю, что я рассматриваю использование расширений WCF в первую очередь для обязанностей типа инфраструктуры. Мне кажется, это скорее проблема бизнес-процесса, поэтому я, вероятно, все равно пошел бы по маршруту очередей. Спасибо за участие, всегда приятно получить разные точки зрения!!
Ответ №2:
Вы не можете сделать это со стандартной привязкой типа запроса / ответа в WCF, потому что, как вы выяснили, вы не получите ответа, пока служба не завершит обработку (или время ожидания). Чтобы сделать то, что вы хотите, вам понадобится служба, в которой вы можете запустить длительную операцию, а затем опросить статус завершения и результаты ответа.
Привязка NETMSMQ поддерживает этот сценарий в WCF. Все операции для этой привязки должны быть односторонним вызовом, поскольку вы только помещаете сообщение в очередь для обработки. Вам потребуется настроить другую конечную точку или службу с привязкой запроса / ответа для метода опроса. Хороший обзор привязки NETMSMQ находится здесь.