我正在设计一个用于Windows CE设备和PC之间的Web服务接口。 Windows CE设备是服务器,PC是客户端。
我决定使用gSOAP库来实现服务器,我正在为客户端使用.NET / C#。我遵循了here描述的方法,一切运行良好。
我的问题是如何最好地实现从服务器到客户端的异步回调/事件。我可以想到两种方法:
我目前选择了选项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设置多线程服务器很简单,并且只有一个客户端(我控制)连接到每个服务器。
这种方法有什么明显的缺点吗?你能建议一个更好的解决方案吗?
答案 0 :(得分:0)
我建议将WinCE设备转换为web客户端而不是网络服务器,将PC转换为服务器,将在客户端上发生通知。这种方法更自然,你仍然可以使用gSoap作为soap客户端。在PC上你应该安装一个像Apache或IIS这样的网络服务器,或者你可以制作一个能够托管嵌入式轻型网络服务器的Windows服务器。