MagicMap WebServices mit MagicMapCE

aus Nomads, der freien Wissensdatenbank

(Unterschied zwischen Versionen)
Version vom 17:33, 18. Dez 2008
Losem (Diskussion | Beiträge)

← Previous diff
Aktuelle Version
Pibach (Diskussion | Beiträge)

Zeile 64: Zeile 64:
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. 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. 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]].

Aktuelle Version

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

'Persönliche Werkzeuge