【问题标题】:What is the best approach for an asynchronous callback/event from gSOAP server?来自 gSOAP 服务器的异步回调/事件的最佳方法是什么?
【发布时间】:2011-10-05 09:02:01
【问题描述】:

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

我决定使用gSOAP 库来实现服务器,并且我使用.NET/C# 作为客户端。我遵循了here 描述的方法,一切正常。

我的问题是关于如何最好地实现从服务器到客户端的异步回调/事件。我可以想到两种方法:

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

这种方法有什么明显的缺点吗?您能提出更好的解决方案吗?

【问题讨论】:

  • 我能想到的唯一缺点是,如果它们一个接一个地直接跟随,你可能会失去一些事件。如果你不关心这个,那应该没问题。
  • 为了简单起见,我在示例中使用了一个事件,但在我的实现中,我将使用带有消息队列句柄的 WaitForSingleObject,然后在队列的前面返回事件。这应该可以防止丢失事件。
  • 那我觉得你应该没有什么大问题。

标签: c# .net web-services windows-ce gsoap


【解决方案1】:

我建议把 WinCE 设备变成一个 webclient 而不是 webserver 和 PC 变成一个服务器,它会在客户端发生某些事情时得到通知。这种方法更自然,您仍然可以将 gSoap 用于肥皂客户端。在 PC 上,您应该安装一个像 Apache 或 IIS 这样的网络服务器,或者您可以制作一个 Windows 服务器来托管嵌入式轻型网络服务器。

【讨论】:

  • 我认为这对我的设置不起作用。设备是一个数据采集单元,由PC上的应用程序控制,大部分通信都是由PC应用程序发起的。
  • 好的,但我仍然认为使用阻塞方法只保持连接打开是不对的。 Gmail/Yahoo 网络邮件客户端如何让您收到新电子邮件的通知?通过 AJAX 进行某种轮询。
  • 这也是困扰我的问题,这就是我问这个问题的原因。 :-) 我认为移动推送通知(Android、iOS 等)是通过不断保持对服务器开放的套接字来实现的,但它们可能使用比阻塞方法更智能的方法......
  • 连接不会立即关闭它有一个可以配置的生存时间(当然它可以在每次通话后立即关闭但没有生产力),所以你不必太担心对这个。邮件网络客户端有一个自适应轮询,他们每 15 秒检查一次,比如说是否有新电子邮件,如果连接断开对 CPU 消耗没有意义,它将在 20 秒内重新请求,以此类推。 PUSH 邮件通知我猜它也与电话运营商有关。
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多