开发者

What is the best approach for an asynchronous callback/event from gSOAP server?

开发者 https://www.devze.com 2023-04-10 14:49 出处:网络
I am designing a webservice interface for use between a Windows CE device and a PC. The Windows CE device is server and the PC is client.

I am designing a webservice interface for use between a Windows CE device and a PC. The Windows CE device is server and the PC is client.

I have decided to use the gSOAP library to implement the server and I am using .NET/C# for the client. I have followed the approach desc开发者_运维知识库ribed here and everything is working well.

My question is about how to best implement an asynchronous callback/event from the server to the client. I can think of two methods:

  1. Continuously polling the server for active events
  2. A blocking method that keeps the connection open until an event occurs

I have currently chosen option 2 and it seems to be working well. I use an asynchronous method in the client and therefore get a callback when the method completes, i.e. when an event occurs on the Windows CE device. I then immediately call the same method again so it is ready for the next event.

Example server method (no error handling):

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

Example client (no error handling):

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
}

The server must be multi-threaded for this approach to work, and the number of clients should be limited so the server does not have a large number of threads hanging with blocking methods. In my case none of these issues are a problem - it is simple to setup a multi-threaded server using gSOAP and there will only ever be one client (which I control) attached to each server.

Are there any significant disadvantages to this approach? Can you suggest a better solution?


I suggest to turn the WinCE device into a webclient instead of a webserver and the PC into a server, that will be notified on something happens on the client. It is more natural this approach, you can still use gSoap for a soap client. On the PC you should have a web-server like Apache or IIS installed, or you could make a Windows server that will host an embedded light webserver.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号