Я пытаюсь понять, как я могу использовать SOAP или XML-RPC для создания удаленного открытого API для моего продукта. Проблема заключается в том, что часть моего API потребует от меня возможности получать события, перенесенные с моего сервера на клиента, - мне нужно будет иметь возможность «отправлять обратный вызов», а не только «вызывать функцию» как часть моего API , Есть ли хороший способ сделать это в SOAP или XML-RPC?Реализация обратного вызова в XML-RPC или SOAP
ответ
Существует два способа уведомления в системе RPC: модель push и модель pull. В модели pull, клиент будет периодически запрашивать сервер, доступны ли какие-либо уведомления. Сервер должен хранить их до тех пор, пока клиент не выберет их (или пока они не истекут). В качестве варианта клиент может иметь блокирующий RPC-вызов, который блокирует до тех пор, пока следующее событие не станет доступным, а затем сразу вернется. Это отлично работает с CORBA, но не так хорошо работает с SOAP или XML-RPC, поскольку реализации HTTP обычно не готовы оставлять соединение открытым в течение нескольких часов.
В модели push производитель будет вызывать RPC на потребителя, делая потребителя сервером. Это слишком плохо работает с SOAP или XML-RPC, так как клиент, как правило, не готов выполнять роль сервера, а брандмауэры могут препятствовать прохождению обратного вызова. Таким образом, периодическая тяга касается наиболее реалистичного подхода.
P.S. вы, возможно, заметили, что я не следовал вашей терминологии: вы не можете нажать события. Событие - это то, что происходит. Вы можете только нажать уведомление, которое является информацией о том, что событие произошло.
Вы можете сделать это с помощью WCF. Однако я не знаю, можете ли вы сделать это в интероперабельном ключе. Посмотрите на Duplex Services.
Хорошо, в конечном итоге было принято решение обработать обратные вызовы как API, которые не возвращаются немедленно.
В принципе, запрос RPC-XML будет отправлен с запросом на уведомление по определенному списку событий. Наш сервер будет ждать, пока произойдет одно из событий, а затем сообщит об этом в ответ или тайм-аут через определенное время, сообщив, что ничего не произошло. Вызывающий вызов сможет снова отправить запрос, чтобы продолжить ожидание.
Это означает, что по существу я остаюсь с периодическими обновлениями, что несколько расточительно с точки зрения ресурсов. Спасибо за ответ –