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

时间:2011-10-05 09:02:01

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

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

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

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

  1. 持续轮询服务器以查找活动事件
  2. 在事件发生前保持连接打开的阻止方法
  3. 我目前选择了选项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 :(得分:0)

我建议将WinCE设备转换为web客户端而不是网络服务器,将PC转换为服务器,将在客户端上发生通知。这种方法更自然,你仍然可以使用gSoap作为soap客户端。在PC上你应该安装一个像Apache或IIS这样的网络服务器,或者你可以制作一个能够托管嵌入式轻型网络服务器的Windows服务器。