Каков наилучший подход для асинхронного обратного вызова / события с сервера gSOAP? - PullRequest
0 голосов
/ 05 октября 2011

Я разрабатываю интерфейс веб-сервиса для использования между устройством Windows CE и ПК. Устройство Windows CE - это сервер, а ПК - клиент.

Я решил использовать библиотеку gSOAP для реализации сервера, и я использую .NET / C # для клиента. Я следовал подходу, описанному здесь , и все работает хорошо.

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

  1. Непрерывный опрос сервера на наличие активных событий
  2. Метод блокировки, который сохраняет соединение открытым, пока не произойдет событие

В настоящее время я выбрал вариант 2, и, похоже, он работает хорошо. Я использую асинхронный метод в клиенте и, следовательно, получаю обратный вызов, когда метод завершается, то есть когда происходит событие на устройстве Windows CE. Затем я немедленно снова вызываю тот же метод, чтобы он был готов к следующему событию.

Пример метода сервера (без обработки ошибок):

int ns__WaitForEvent(struct soap* soap, int *eventId)
{
    WaitForSingleObject(hMyServerEvent, INFINITE);
    *eventId = GetCurrentEventId();
    return SOAP_OK;
}

Пример клиента (без обработки ошибок):

private void SubscribeToServerEvents()
{
    var server = new MyMethods.ServicePortTypeClient(
                        new BasicHttpBinding(), 
                        new EndpointAddress(myIpAddress));
    AsyncCallback cb = this.Callback;
    server.BeginWaitForEvent(cb, server);
}

private void Callback(IAsyncResult ar)
{
    var server = (MyMethods.ServicePortType)ar.AsyncState;
    var result = server.EndWaitForEvent(ar);
    // Do stuff with result
}

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

Есть ли существенные недостатки этого подхода? Можете ли вы предложить лучшее решение?

1 Ответ

0 голосов
/ 07 октября 2011

Я предлагаю превратить устройство WinCE в веб-клиента вместо веб-сервера, а ПК в сервер, который будет уведомлен о том, что происходит на клиенте.Такой подход более естественен, вы все равно можете использовать gSoap для мыльного клиента.На ПК должен быть установлен веб-сервер, такой как Apache или IIS, или вы можете создать сервер Windows, на котором будет размещен встроенный легкий веб-сервер.

...