Веб-сервисы.Получить входные данные, обработать их в фоновом потоке - PullRequest
1 голос
/ 13 июля 2010

У меня есть несколько веб-сервисов: asmx, wcf. В некоторых из них есть несколько методов, которые занимают много времени для обработки, но размер входных данных для этих методов невелик, и передача по проводам занимает не так много времени. Я хочу перейти к несинхронизированной модели. Клиент передает данные службе, служба отвечает, что передача данных была правильной, и обрабатывает их в фоновом потоке без связи с клиентом. Поэтому передающее соединение должно быть закрыто. Является ли это возможным? Можете ли вы помочь мне со статьями или может быть просто запрос Google.

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

Джон прав: как только вы закроете http-соединение, все готово. Вы не можете вернуться к тому же процессу.

Так что, если вы можете использовать другую технологию, которая позволяет дуплекс на одном соединении (например, WCF), сделайте это!

Однако

если у вас нет выбора, кроме как использовать веб-сервисы,

вот три способа заставить это работать. Вы можете получить таймауты на любом из них.

Вариант 1:

Забудьте часть о том, что «данные ответов клиента верны». Просто сделайте, чтобы каждый поток сделал свой запрос и ждал данных.

Вариант 2:

Теперь, если предположить, что это не сработает, и вы должны выполнить проверку, этот способ требует, чтобы клиент сделал 2 запроса.

Первый запрос: возвращает действительный / недействительный. Второй запрос: возвращает долгосрочные результаты.

Вариант варианта 2:

Если у вас есть проблемы с тайм-аутом, вы можете в первом запросе сгенерировать GUID или уникальный ключ базы данных и запустить другой процесс, передав ему этот ключ, и вернуть ключ клиенту. (если вы можете заставить сервер позволять вам запускать процесс - зависит от настроек / потребностей безопасности - если нет, то вы можете запустить асинхронный поток и продолжить его работу после завершения websvc?) Процесс выполнит длинная задача, обновите строку в базе данных с уникальным идентификатором, когда закончите, показывая результаты плюс флаг «сделано». Второй запрос клиента всегда может вернуться немедленно, а если обработка не завершена, вернуть, если это так, вернуть результаты. Клиент будет повторять это каждые 5 секунд или около того, пока не будет сделано.

Хаки, я знаю, но у нас не всегда есть выбор для технологии, которую мы используем.

1 голос
/ 13 июля 2010

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

Это более практично для WCF.

0 голосов
/ 13 июля 2010

Мы пишем материал для взаимодействия с веб-сайтом правительства Великобритании, и способ, которым они обрабатывают что-то похожее, заключается в том, что вы отправляете свой запрос и данные на сервер, и он отвечает примерно: «Большое спасибо - мы обрабатываем это теперь, пожалуйста, перезвоните позже, используя этот идентификатор "- все в XML-сообщении. Затем, в какой-то момент позже, вы отправляете новый http-запрос в службу, говоря, по сути, «я спрашиваю о состоянии этого конкретного идентификатора запроса», и сервер возвращает результат, который говорит, что он обработан нормально или обработан с ошибками или все еще обрабатывается, повторите попытку через XX секунд.
Аналогичен варианту 2, описанному ранее.
Это решение опроса, а не обратный вызов или двухсторонний разговор, но, похоже, он работает.

Сервер должен будет хранить или иметь доступ к какой-либо форме постоянной таблицы или журнала для каждого состояния запроса - он может содержать, например, идентификатор, исходный запрос, текущий этап рабочего процесса, любые сообщения об ошибках до сих пор. результат (если есть) и т. д. И веб-служба, вероятно, должна была передать большую часть запроса отдельной службе Windows, как уже упоминалось.

...