Реализация обратного вызова в XML-RPC или SOAP - PullRequest
6 голосов
/ 20 августа 2009

Я пытаюсь понять, как я могу использовать SOAP или XML-RPC для создания удаленного открытого API для моего продукта. Проблема в том, что часть моего API потребует, чтобы я мог передавать события с моего сервера клиенту - мне нужно будет иметь возможность «отправлять обратный вызов», а не только «вызывать функцию» как часть моего API. Есть ли хороший способ сделать это в SOAP или XML-RPC?

Ответы [ 3 ]

7 голосов
/ 20 августа 2009

Существует два способа сделать уведомления в системе RPC: модель push и модель pull. В модели pull клиент периодически запрашивает у сервера, доступны ли какие-либо уведомления. Сервер должен хранить их до тех пор, пока клиент не получит их (или пока не истечет срок их действия). Как вариант, клиент может иметь блокирующий вызов RPC, который блокирует, пока следующее событие не станет доступным, а затем сразу же возвращается. Это прекрасно работает с CORBA, но не очень хорошо работает с SOAP или XML-RPC, поскольку реализации HTTP, как правило, не готовы оставлять соединение открытым в течение нескольких часов.

В модели «push» производитель будет вызывать RPC для потребителя, делая его потребителем сервером. Это не слишком хорошо работает с SOAP или XML-RPC, поскольку клиент, как правило, не готов принять роль сервера, а брандмауэры могут препятствовать обратному вызову. Таким образом, периодическая тяга является наиболее реалистичным подходом.

P.S. Возможно, вы заметили, что я не следовал вашей терминологии: вы не можете отправить события . Событие - это то, что происходит. Вы можете только нажать на уведомление, которое является информацией о том, что событие произошло.

1 голос
/ 16 сентября 2009

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

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

0 голосов
/ 21 августа 2009

Вы можете сделать это с WCF. Однако я не знаю, можете ли вы сделать это совместимым образом. Посмотрите на Дуплекс Услуги .

...