从gSOAP服务器接收异步回调/事件的最佳方法是什么?

本文关键字:事件 最佳 方法 是什么 回调 服务器 gSOAP 异步 | 更新日期: 2023-09-27 18:10:32

我正在设计一个用于Windows CE设备和PC之间的web服务接口。Windows CE设备为服务器,PC机为客户端。

我决定使用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设置多线程服务器很简单,并且每个服务器上只会有一个客户端(由我控制)。

这种方法有什么明显的缺点吗?你能提出一个更好的解决办法吗?

从gSOAP服务器接收异步回调/事件的最佳方法是什么?

我建议把WinCE设备变成一个网络客户端而不是一个网络服务器,把PC变成一个服务器,这样在客户端发生事情时就会收到通知。这种方法更自然,您仍然可以将gSoap用于soap客户机。在PC上,你应该安装一个web服务器,比如Apache或IIS,或者你可以做一个Windows服务器,它将托管一个嵌入式轻量级web服务器。