MagicMap WebServices mit MagicMapCE
aus Nomads, der freien Wissensdatenbank
Infos zur Behandlung der MagicMap WebServices mit dem MagicMapCE-Client in C#
Inhaltsverzeichnis |
Visual Studio / c#
Webservices werden in Visual Studio folgendermaßen integriert: Rechter Mausklick auf das Projekt -> "Webverweis hinzufügen" -> im folgenden Fenster den Link zur entsprechenden WSDL-Seite eingeben -> Kurz warten, bis Webservice gefunden -> Klick auf "Verweis hinzufügen"
Die Webservices werden wie normale Variablen initialisiert:
private MapFacadeService mapService = new MapFacadeService(); private PositionFacadeService positionService = new PositionFacadeService(); private SessionFacadeService sessionService = new SessionFacadeService();
Der Namespache der benutzten Webservices muss in den Using-Directives stehen
using ...
(Namen werden von Visual Studio erzeugt)
Vor der Verwendung eines Webservices muss seine URL gesetzt (server ist hier die Adresse des Servers, auf dem der MagicMap Server läuft)...
private const string POSITION_URL = "/magicmap/services/PositionFacade?wsdl"; ... positionService.Url = "http://" + server + POSITION_URL;
und der Zeichensatz der Request gewählt werden (im Falle für WinCE / C#: ASCII).
mapService.RequestEncoding = System.Text.Encoding.ASCII;
Aufruf der Webserviemethoden
Synchroner Aufruf
Anschließend kann auf die Webservices wie auf Funktionen jeder anderen Klasse zugegriffen werden, etwa
positionService.createOrUpdatePosition(...);
Asynchroner Aufruf
Der synchrone Aufruf einer Webservicemethode kann aufgrund der eventuell zu übertragenden Datenmenge bzw. der benötigten Bearbeitungszeit des Services mehrere Sekunden benötigen, bis er beendet ist. Je nach Implementierung kann dies relevante Teile des Programmes (etwa die GUI) für diese Zeit blockieren. Der MagicMapCE-Client wurde bspw pro Synchronisation für mehrere Sekunden unbedienbar.
Diese Effekte können durch einen asynchronen Aufruf des Webservices verhindert werden. Hierzu verwendet man Callbacks.
Man ruft den Webserive "Xy" aus der Klasse "z" dann über
z.BeginXy(Signatur des synchronen Webservice, (new AsyncCallback(ab)), null);
auf. Dieser Aufruf kostet keine Zeit, die Behandlung findet über einen separaten Thread statt.
Zusätzlich muss dann noch eine Methode "ab" definiert werden, welche aufgerufen wird, wenn der Webservice beendet ist, und dessen Ergebnis behandelt, etwa
public void ab(IAsyncResult result)
{
(Rückgabetyp des Webserice) x;
x = z.EndXy(result);
...
}
Die Begin... und End... Methoden werden von VisualStudio automatisch erzeugt.
Hierbei ist zu beachten, dass auch die Callback-Methode in dem gesonderten Thread abläuft und somit in einem anderen Kontext operiert. Prinzipiell kann dies abgefangen werden, in dem man die Methode über Delegaten behandelt (siehe hierzu auch MSDN zu asynchronen Webservices und Callbacks). Für den MagicMapCE-Client konnte die Delegaten-Lösung nicht angewandt werden, da das Programm in diesem Fall aus ungeklärten Gründen abstürzte. Als Umweg, trotzdem die Callbacks zu nutzen wurden Variablen in die Hauptklasse eingebettet, in welche die entsprechenden übertragenen Objekte zwischengespeichert werden. Beim nächsten Aufruf der nächsten Synchronisation werden diese Objekte dann (somit im richtigen Kontext) behandelt. Dies führt leider dazu, dass die Objekte etwas verspätet erscheinen, bringt aber den Vorteil, dass die Anwendung durchgängig bedienbar bleibt. Wenn möglich, sollte hier nochmals versucht werden, die Nutzung der Delegaten zu ermöglichen, damit die übertragenen Objekte sofort verfügbar sind.
weitere Links
- siehe auch MagicMap_WebServices#Zu_beachten.
