Асинхронные вызовы веб-службы - PullRequest
1 голос
/ 27 мая 2011

Я ищу создание веб-службы и сопутствующего веб-приложения, которое использует асинхронный вызов веб-службы.Я видел множество предложений о том, как выполнять асинхронные вызовы, но ни один из них не подходит точно к тому, что я пытаюсь сделать, или использую действительно устаревшую технологию.Я пытаюсь сделать это в ASP.net 3.5 (VS2008)

Что мне нужно сделать, это:

  1. веб-странице необходимо отправить запрос в службу
  2. страница должна затем опрашивать службу каждые 5 секунд или около того, чтобы увидеть, завершена ли задача
  3. после завершения запроса необходимо извлечь из службы.

Может ли кто-нибудь дать мне несколько советов или указать мне правильное направление?

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Я обычно выполняю асинхронную обработку на стороне сервера следующим образом:

  1. Сделайте так, чтобы веб-страница инициировала запрос к веб-службе, и чтобы служба возвращала идентификатор долгосрочномусделка.В моем случае я использовал Ajax с jQuery на веб-странице клиента и веб-сервис, который возвращает данные в формате JSON.ASP.NET MVC особенно хорошо подходит для этого, но вы можете использовать ASP.NET для возврата строки JSON в ответ на GET или вообще не использовать JSON.

  2. Есть серверсоздать запись в базе данных, которая также хранит связанные данные для обработки.Идентификатор этой транзакции возвращается на веб-страницу клиента.Затем служба отправляет сообщение третьему сервису через очередь сообщений.В моем случае это была служба WCF, размещенная в службе Windows с MSMQ в качестве посредника.Следует отметить, что лучше не выполнять фактическую обработку задач в ASP.NET, поскольку она не предназначена для длительных запросов.В системе с высоким спросом вы можете исчерпать доступные потоки.

  3. Третий сервис получает и отвечает на сообщение в очереди, считывая и обрабатывая необходимые данные из базы данных.В конечном итоге он отмечает запись базы данных как «завершенную».

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

  5. Клиентская веб-страница обрабатывает ответ веб-службы, который будет содержать результирующие данные или пустой набор, в котором он должен продолжить опрос.

Это просто пример, вы можете обнаружить, что вы можете использовать ярлыки и избегать обработки в третьем сервисе и просто использовать потоки ASP.NET.Но это создает свои собственные проблемы, а именно то, как у вас будет другой запрос (запрос на опрос), чтобы узнать, завершен ли исходный запрос.Решение этой проблемы - использовать потокобезопасную коллекцию в статической переменной, которая будет содержать пару идентификатор транзакции / результат.Но для этих усилий действительно лучше использовать базу данных.

РЕДАКТИРОВАТЬ: теперь я вижу, что это, скорее, демонстрационная, чем производственная система.Я все еще придерживаюсь своей схемы, приведенной выше, для ситуаций «реального мира», но для демонстрации «хакерского» решения будет достаточно.

0 голосов
/ 27 мая 2011
  • Шаг 0 : создание веб-службы.
  • Шаг 1 : создание проекта веб-приложения (при условии, что это ASP.NET).
  • Шаг 2 : Добавьте веб-ссылку на веб-службу в проект веб-приложения.
  • Шаг 3 : ссылка создаст для вас прокси, с помощью которого вы сможете вызывать как синхронные, так и асинхронные вызовы.
0 голосов
/ 27 мая 2011

Какую часть нужно будет сделать асинхронной?Насколько я могу судить, ваши действия синхронны: 1) -> 2) -> 3)

Простой веб-сервис подойдет, IIS (как и любой веб-сервер) поддерживает несколько запросов на асинхронную обработку, поэтому вынет проблем.

Нечто , о котором вам может потребоваться знать.А также движок JavaScript выполняет код в одном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...