Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Web Services einfach konsumieren

Geschrieben von: Christian Holm
Kategorie: Web Services

This printed page brought to you by AlphaSierraPapa

Web Services sind dazu da um konsumiert zu werden! Die Erstellung eines Web Services mit klassischen Entwicklungstools wie Visual Basic 6 und Active Server Pages ist ja Dank des Microsoft SOAP Toolkits relativ einfach. Nach der Erstellung des Web Service soll der Client aber auch die Dienste benutzen, d.h. konsumieren können. Dieser Artikel zeigt Ihnen anhand eines einfachen Beispiels, wie das mit Hilfe des SOAP Toolkits geht.

Im Artikel Web Services mit dem SOAP Toolkit erstellen haben wir einen einfachen Web Service erstellt, der einen String zurückliefert. Im heutigen Artikel zeige ich Ihnen, wie man diesen Web Service client-seitig konsumieren kann. Für das Konsumieren benötigt man das SOAP Toolkit, weitere Informationen dazu (und Download) finden sich im zuvor genannten Artikel.

Der "Konsum"-Prozess (Ähnlichkeiten mit realen Bezügen nicht beabsichtigt) beginnt mit einem Request des Clients. Dieser Request stellt bei Verwendung unseres Web Services aus dem Artikel Web Services mit dem SOAP Toolkit erstellen einen Methodenaufruf dar. Eben dieser Request wird vom SoapClient Objekt entgegengenommen und erstellt einen SOAP Request der dem Web Server übergeben wird. Der Server bearbeitet dann den Request, führt die erhaltenen Anweisungen aus, und schickt das Ergebnis als SOAP Response wieder zurück zum Client. Dort formuliert der SoapClient aus der SOAP Response eine, für den Benutzer des Web Service lesbare Anwort, die das Ergebnis aus der Prozedur enthält.

Bildlich gesprochen passiert also folgendes:

Damit dieser Prozeß ablaufen kann, muß vorher das SoapClient Objekt von der jeweiligen Anwendung instanziert werden. Nachdem dies erfolgreich geschehen ist, initialisieren wir das Objekt mit der mssoapinit Methode, welche aus der WSDL (Web Services Description Language) Datei die nötigen Informationen für diesen Vorgang bezieht.

Die Syntax der mssoapinit Methode sieht folgendermaßen aus:

object.mssoapinit("WSDLFile", "ServiceName", "Port", "WSMLFile")

Die Parameter dieser Methode bedeuten:

  • WSDLFile: Angabe des URLs der WSDL Datei
  • ServiceName: Eigentlicher Service, der in der WSDL Datei beschrieben wird. Dieser Parameter is optional, d.h wenn er weggelassen wird, verwendet die Methode den ersten in der Datei berschriebenen Service. Der Eintrag in der WSDL Datei sieht so aus:
  • <service name='SimpleWebService' >
    
  • Port: Der Name des Ports, der in Der WSDL Datei angeführt ist; optional; Eintrag in der WSDL Datei:
  • <portType name='SimpleWSSoapPort'>
    
  • WSMLFile: Angabe des URLs der WSML (Web Services Meta Language) Datei; optional
  • Nach der Initialisierung tritt der WSDLReader in Aktion. Dieses Objekt liest die von den WSDL und WSML Dateien bereitgestellten Informationen, die den Web Service beschreiben ein, und lädt diese in ein DOM (Document Object Model). Durch die nun erhaltenen Informationen (Methodenaufruf der zugänglichen Methode RetString) kann ein WSDLOperation Objekt erstellt werden. Dieses Objekt enthält Eigenschaften, die die IO Messages des Web Service betreffen.

    Danach erstellt der SoapClient für die RetString Methode einen SoapMapper und zusätzlich werden vom SoapClient Objekt die IO Messages (in unserem Fall wird nur ein Outputstring erwartet) in diesen geladen. Der SoapSerializer erstellt anhand des SoapMappers einen SoapRequest der dann zum Server geschickt und verarbeitet wird.

    Nach der serverseitigen Verarbeitung schickt der Server eine SOAP Response (den Outputstring) zum Client zurück. Das SoapClient Objekt nimmt diese Response entgegen, packt diese in den dafür vorgesehenen Outputteil des vorher erstellten SoapMappers und schickt dies zurück zur Client Applikation.

    Sehen wir uns nun aber die Theorie in einem einfachen Beispiel an. Es gibt viele Möglichkeiten um einen Web Service zu konsumieren. Die erste und gleichzeitig einfachste ist jene, den Methodenaufruf der von außen zugänglichen Methode(n) in eine VBScript Datei zu packen. Warum dies? Es ist, wie gesagt die einfachste und schnellste Möglichkeit einen Web Service zu testen, bevor man es mit einer GUI konsumiert.

    Wir erstellen also eine VBScript Datei (consumer.vbs), die die nötigen Anweisungen zum Konsumieren des Web Service beinhaltet:

    Option Explicit
    
    Dim SoapClient
    Set SoapClient = CreateObject("MSSOAP.SoapClient") 
    On Error Resume Next
    Call SoapClient.mssoapinit("http://127.0.0.1/WSSoap/SimpleWebService.WSDL",  _
           "SimpleWebService", "SimpleWSSoapPort")
           
    If err <> 0 Then
      wscript.echo "Init Failure: " + err.description
    End If
    
    wscript.echo  SoapClient.RetString
    If err <> 0 Then
      wscript.echo   "Error: " + err.description
      wscript.echo   "Error Code: " + SoapClient.faultcode
      wscript.echo   "Error String: " + SoapClient.faultstring
      wscript.echo   "Fault Actor: " + SoapClient.faultactor
      wscript.echo   "Detailed Information: " + SoapClient.detail
    End If
    

    Da für Testzwecke auch eine Fehlerbehandlung notwendig ist, habe ich diese gleich miterstellt. Das SoapClient Object besitzt schon von Haus aus einige Properties, mit denen man eine mögliche Fehlerquelle diagnostizieren kann.

    Nach dem Speichern der Datei rufen wir das Command Prompt (cmd.exe) auf, und wechseln in das Verzeichnis, wo sich die WScript Datei befindet. Wir können nun mit

    cscript consumer.vbs
    

    den Web Service konsumieren. Bei erfolgreichem Ablauf präsentiert sich an der Kommandozeile folgendes Ergebnis:

    Da dieses Beispiel sehr einfach ist, schreiben wir schnell eine ASP Version, indem wir einfach den obigen Code etwas anpassen:

    <%
    Set SoapClient = CreateObject("MSSOAP.SoapClient")
    On Error Resume Next
    
    SoapClient.mssoapinit "http://127.0.0.1/WSSoap/SimpleWebService.WSDL"
    
    If err <> 0 Then
      Response.Write "Init Failure: " & Err.description
    End If
    
    SoapClient.RetString()
    If Err <> 0 Then
      Response.Write "<br><b>Error:</b> " & Err.description 
      Response.Write "<br><b>Error Code:</b> " & SoapClient.faultcode
      Response.Write "<br><b>Error String:</b> " & SoapClient.faultstring
      Response.Write "<br><b>Fault Actor:</b> " & SoapClient.faultactor
      Response.Write "<br><b>Detailed Information:</b> " & SoapClient.detail
    End If
    
    %>
    

    Bei Ausführen dieser Datei bietet sich das gleiche - zugegebenermaßen einfallslose - Bild. Interessanter wird es aber wenn ein Fehler auftritt. Wenn ich nun gemeinerweise etwas an den Dateien "herumpfusche" (natürlich nur für die Demozwecke), präsentiert sich für des Entwickers Augen eine ausführliche Fehlerbeschreibung:

    Was ich damit demonstrieren wollte ist, daß man auf Fehlerbehandlung beim Konsumieren von Web Services nicht verzichten sollte. Es handelt sich ja schließlich um Services, die über Netzwerkverbindungen angesprochen werden - und diese als auch die Services selbst können ja einmal nicht verfügbar sein.

    Schlußbemerkung

    Dieser Artikel zeigte Ihnen wie man auf altbewährte Art und Weise, also mit VBScript und ASP, einen Web Service konsumiert. Das Beispiel war mit Absicht einfach gehalten, um den ablaufenden Prozess verständlich zu machen.

    This printed page brought to you by AlphaSierraPapa

    Download des Codes

    Klicken Sie hier, um den Download zu starten.
    http://www.aspheute.com/code/20010703.zip

    Verwandte Artikel

    Amazon.com Web Services 2.0
    http:/www.aspheute.com/artikel/20021029.htm
    Programmieren mit den Google Web APIs Beta 2
    http:/www.aspheute.com/artikel/20020415.htm
    Web Services mit dem SOAP Toolkit erstellen
    http:/www.aspheute.com/artikel/20010629.htm

     

    ©2000-2006 AspHeute.com
    Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
    Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.