Von APD über COM nach SOAP Teil 3

Nachdem in den letzten beiden Teilen die Grundlagen erläutert worden sind, werden wir heute einen kompletten SOAP-Webservice auf Basis eines Gupta-COM-Objekts erstellen.

Erstellen der COM-Funktion

Als Beispiel möchten wir Daten zu einem Ansprechpartner in einer SqlBase-Datenbank abspeichern.  Attribute des Ansprechpartners sollen Vorname, Nachname, Geburtstag und Glückszahl sein. Dazu erstellen wir im Gupta-COM-Objekt aus Teil 2 eine neue Funktion „ContactSave“:

Returns
 Boolean:
Parameters
 String: sFirstName
 String: sLastName
 Date/Time: dtBirthday
 Number: nLuckyNumber
  Use: VT_I4
 Receive String: rsErrorMsg

Local variables
 Number: nContactId
 Number: nFetch
 Sql Handle: hSql
 Boolean: bOk

Actions
 ! Ensures that ISLAND-Database is present and Contact-Table exists
 If ( TryConnectAndCheckDb( rsErrorMsg ) )
  If ( SqlConnect( hSql ) )
   ! get next id
   Call SqlPrepareAndExecute( hSql, 'SELECT MAX(ContactId) FROM GuptaComContact INTO :nContactId' )
   Call SqlFetchNext( hSql, nFetch )
   If ( NOT nContactId )
    Set nContactId = 0
   Set nContactId = nContactId + 1
   ! insert data
   Set bOk = SqlPrepareAndExecute( hSql, 'INSERT INTO GuptaComContact ( ContactId, FirstName, LastName, Birthday, LuckyNumber )
       VALUES ( :nContactId, :sFirstName, :sLastName, :dtBirthday, :nLuckyNumber)' ) 
   If ( bOk )
    Call SqlPrepareAndExecute( hSql, 'COMMIT' )
   Else
    Set rsErrorMsg = 'Sqlerror while inserting contact'
   ! disconnect everything - function call must be stateless!
   Call SqlDisconnect( hSql )
   Return bOk
  Else
   Return FALSE

Der vollständige Code ist kann hier heruntergeladen werden.

Erstellen des SOAP-Webservices

Hier das Kochrezept:

  • Starten von Visual WebDeveloper Express 2010
  • neue „Leere ASP.NET-Webanwendung mit Namen „GuptaSoap“ erstellen
  • im Projektmappenexplorer per rechter Maustaste / Hinzufügen / Neues Element dort den Webdienst auswählen, diesen GuptaSoap nennen

Sieht man sich die automatisch generierte Datei „GuptaSoap.asmx.cs“ an, ist bereits automatisch eine Webservice-Funktion „HelloWorld“ angelegt. Bereits jetzt kann man das Projekt starten (F5). Ist alles in Ordnung, startet ein Development-Webserver sowie ein Browser-Fenster. Klickt man auf den Link „Hello World“ erscheint ein automatisch generiertes Testfenster. Drückt man auf den Button „Aufrufen“, wird die WebService-Funktion „HelloWorld“ aufgerufen und das Ergebnis ( ein XML-Dokument im SOAP-Format ) angezeigt. Hurra.
Anmerkung 1: Sollte nach Start von F5 nicht gleich der HelloWorld-Webservice angezeigt werden, sondern eine Dateiauflistung, dann GuptaSoap.asmx anklicken.
Anmerkung 2: Eventuell auftauchende Messageboxen wg. „Web.Config“ oder dem „Namespace“ klicken wir einfach weg.

Einbinden des COM-Objekts

  • im Projektmappenexplorer per rechter Maustaste einen Verweis hinzufügen
  • unter „COM“ die GuptaCom 1.0 Type Library auswählen (Doppelklick)

In GuptaSoap.asmx.cs wird der eigentliche Code geschrieben:

[WebMethod]
 public ContactSaveResult ContactSave(String sFirstName, String sLastName, DateTime dtBirthday, Int32 nLuckyNumber)
 {} 

Die sog. Compiler-Direktive „[WebService]“ gibt an, dass die darauf folgend definierte Funktion als SOAP-Webservice „exportiert“ werden soll.

Die Webservicefunktion heißt ContactSave , nimmt die vier o.g. Parameter an und liefert ein Ergebnis in Form eines Structs zurück. Der Struct ist so definiert:

public struct ContactSaveResult
 {
  public Boolean bRet;
  public String sErrorMsg;
 }

Er besteht aus einem allgemeinen Returnwert bRet, der anzeigt, ob der Aufruf erfolgreich war. Ratsam ist außerdem eine möglichst aussagekräftige Fehlermeldung, die allen Beteiligten das Leben erleichtert. Die ganze Chose besteht  aus relativ vielen Komponenten (COM-Objekt, Gupta-Runtime, Datenbankanbindung und schließlich der Datenbank selbst); wenn auch nur eine davon streikt (bzw. falsch konfiguriert ist) schlägt der Aufruf fehl. In dem Fall ist es extrem hilfreich, anhand der Fehlermeldung die Ursache herausfinden zu können (ich spreche aus Erfahrung).

Die Funktion ContactSave(..) wird nun noch mit Leben gefüllt:

Zunächst wird der Return-Strukt instanziiert:

ContactSaveResult cResult = new ContactSaveResult();

Da das Instanziiern des COM-Objekts und der eigentliche Funktionsaufruf „unkontrolliert“ fehlschlagen kann (z.B. GuptaSoap wurde nicht registriert) fangen wir das in einem try-catch-Block ab:

try
 {
  GuptaCom.MyCom cGc = new GuptaCom.MyCom();  //instanziieren des COM-Objekts
  // der eigentliche Funktionsaufruf
  cResult.bRet = cGc.ContactSave(sFirstName, sLastName, dtBirthday, nLuckyNumber, ref cResult.sErrorMsg);
 }
 catch (Exception e)
 {
  cResult.bRet = false; // in jedem Fall war der Aufruf nicht erfolgreich
  cResult.sErrorMsg = e.Message; // die Exception gibt Auskunft über sich selbst. Die geben wir zurück
 }

Zu guter letzt geben wir den Return-Strukt zurück. Und das war’s.

return cResult;

Freundlicherweise stellt uns Visual-Studio gleich ein Testformular zur Verfügung, so dass wir uns nicht extra einen Applikation schreiben müssen, um den SOAP-Call in Aktion zu sehen. Einfach F5 und los geht’s.

Die einzige Voraussetzung ist, dass die SqlBase-Datenbank „ISLAND“ mit dem Standardlogin (User „sysadm“ PW „sysadm“ ) bereit steht. Ggf. könnt Ihr DB-Name und Login in der Funktion „TryConnectAndCheckDb(..)“ abändern. Grundsätzlich läuft es auch auf anderen DBMS (SqlServer, Oracle), allerdings muss das Creation-Skript für Tabelle und Index in eben dieser Funktion angepasst werden.

Have fun!

Hier alle Quellcodes zum Download:

GuptaCom.zip

GuptaSoap.zip

Advertisements

Über thomasuttendorfer
Ich bin Entwicklungsleiter bei der Softwarefirma [ frevel & fey ] in München. Wir entwickeln Business-Software für Verlage und verwenden dafür den Gupta Team-Developer sowie Visual Studio.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: