2013-03-05 2 views
2

я кодирование веб-служба A и вызов веба-служба В.Как сделать асинхронную работу частью веб-сервиса?

После того, как я проверить вход на AI хочет возвращения код успешного завершения и затем Invoke B.

Пути Я рассматриваю :

  • Видеть, могу ли я порождать рабочий поток, который будет завершен после возвращения A.
  • Кодирование агента или услуги для вызова B и использование надежной очереди для передачи утвержденных параметров.

Контекст времени выполнения - это Service.svc, размещаемое веб-приложением ASP.NET.

Как мне это сделать?

Обновление: Я просто хочу сказать, что ответы были полезны. Я решил отметить тот, который использовал.

+0

Вы можете сделать это несколькими способами, что вы используете для своего веб-сервиса? WCF? МЫЛО? Отдых? – Greg

+0

Это веб-сервис WCF, размещенный на веб-сайте MVC. –

ответ

2

После того, как я проверить на вход AI хочет вернуть код успеха и затем вызвать B.

В этом случае вы должны поместить работу в постоянной очереди (MSMQ, Azure Bus, и т.д.) , и только затем вернуть код успеха. Другая система (не размещенная в ASP.NET, т. Е. Роль рабочего агента Azure, служба Win32 и т. Д.) Должна извлекать работу из очереди и вызывать B.

Это единственный надежный способ сделать это. У Фила Хаака есть good blog post о том, почему это плохая идея сделать обе части в ASP.NET; это сводится к утилизации. Дополнительная информация о триггерах возврата here и here.

+0

ли асинхронные веб-службы несут те же риски, описанные в этом сообщении в блоге? –

+0

Не нормально. По умолчанию ASP.NET не будет отправлять свой ответ до тех пор, пока все асинхронные операции не будут завершены. Таким образом, может существовать период времени (когда выполняется процесс ввода/вывода async), когда в запросе нет потоков, но это нормально, потому что ответ еще не отправлен. Проблемы возникают при попытке выполнить работу * после отправки ответа; IIS и ASP.NET просто не предназначены для этого сценария. –

2

Эта ссылка в Code Project должна предоставить вам всю информацию, необходимую для создания стабильной Async Communication with Windows Communication Foundation.

Книга с большим количеством обработки этой формы общения:

  • WCF Шаг за шагом
  • WCF В многоуровневую Framework

Будем надеяться, что помогает. Я приведу несколько примеров, но этот учебник по Code Project должен предоставить именно то, что вам нужно.

+0

эта статья выглядит очень хорошо .. поэтому возвращаемое значение вызова Begin будет кодом успеха, который я упомянул в моем вопросе, не так ли? –

+0

Да. Я так считаю. – Greg

1

Ваша вторая идея - хорошая. Отправьте асинхронную часть в службу Windows. Если вам нужна надежность, сделайте это, используя очередь сообщений. В любом случае вы можете использовать WCF для отправки запроса другой службе.

1

Вопрос не имеет особого отношения к конкретному сервисному интерфейсу. Как правило, ваше решение зависит от того, почему вы хотите, чтобы вызвать что-то асинхронно:

  1. Если вы просто хотите, чтобы дать клиенту быстрый ответ на один продолжительном вызов метода вызова вашего метода асинхронного и сразу Вернуть токен (идентификатор задачи или тому подобное), который может быть использован для проверки выполнения задачи позже.
  2. Если у вас есть несколько длительных методов для выполнения, и вы в основном хотите асинхронно вызывать эффективность с помощью параллелизма, вызовите все, что вы можете в начале &, продолжайте все, что не зависит от предыдущего метода. Ожидайте выполнение любых задач, необходимых для завершения результата возврата, или для последующей задачи.
  3. В большинстве случаев я предоставлял клиенту выбор между синхронным и асинхронным методом с маркером статуса; если они хотят продолжить, они могут проверить позже, и если важно получить этот результат, прежде чем продолжить, ну, это тоже вариант.

Подход к ним упрощается с каждым последующим выпуском фреймов> 3.5, и я верю, что другие ответы дали вам хорошее представление о специфике того, как начинать, двигаться и/или ждать результатов асинхронной задачи в C#.

+0

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

+0

Да, вы определенно находитесь в сценарии №1. Вы хотите запустить задачу и вернуть идентификатор, который можно использовать для проверки его статуса. Предположительно, второй (более медленный) вызов веб-службы будет просто обновлять то, что все еще можно увидеть с учетом этого ID; это довольно классический вариант использования для дизайна, поэтому я не буду болтать об этом здесь; Я предполагаю, что у вас есть какой-то кеш ключа/значения для хранения статусов задач. –

Смежные вопросы