zurück
Autor:
Erstellt am: 10 Aug 2001 00:00

WebService mit ASP - Teil 2

Hier stelle ich ihnen den eigentichen Service vor der von der Web Services Description Language als Referenz verwendet wird. Diese ASP Datei wird jedesmal ausgeführt, wenn eine Anfrage von einem Client kommt. Wenn Sie den vorhergehenden Artikel ansehen und das Element <service> genauer unter die Lupe genommen haben so wissen sie wie diese ASP Datei heisst - ics.asp

<service name='ICS' >
   <port name='ICSSoapPort' binding='wsdlns:ICSSoapBinding' >
      <soap:address location='http://IhrServer/Verzeichnis/ics.asp' />
   </port>
</service>


<%@ LANGUAGE=VBScript %>

Als erstes deklariere ich eine Konstante mit der Adresse des Wrapper-Elementes und setzte den Content Type auf text/xml.

<%

Private Const WRAPPER_ELEMENT_NAMESPACE = "http://tempuri.org/message/"

Response.ContentType = "text/xml"

If Not Process() Then
  Response.Status = "500 Internal Server Error"
End If

Public Function Process()

On Error Resume Next

Process = False


Als nächstes instanziiere ich des SOAP-Reader den ich hierzu benötige und Lade mir den Request des Services.

Set Reader = Server.CreateObject("MSSOAP.SoapReader")
If Err Then Exit Function End If

Reader.Load Request
If Err Then Exit Function End If


Um weitermachen zu können muss ich überprüfen, ob ein RCP Wrapper im oben geladenen Request vorhanden ist.

If Reader.RPCStruct Is Nothing Then Exit Function End If

Im 1. Teil des Artikels haben wir unserer Funktion im wsdl-File einen Namen gegeben - getForumList.
Wird diese Operation gefordert steht in MethodName der String - getForumList

MethodName = Reader.RPCStruct.baseName
If Err Then Exit Function End If


Da wir unserer Funktion Parameter übergeben haben müssen wir diese auch auslesen. Dazu müssen wir vom SoapReader das RCPParameter - Objekt instanziieren indem wir das Objekt mit dem Parameternamen initialisieren.
Sollten Sie mit mehreren Funktionen und verschiedenen Parameter arbeiten kann es sein dass ein RPCParameter leer, also Nothing ist.

'USR - ID of User
Set Parameter = Reader.RPCParameter("USR")
If Parameter Is Nothing Then
   USR = ""
else
   USR = CStr(Parameter.Text)
End If
If Err Then Exit Function End If

'PWD - Password of User
Set Parameter = Reader.RPCParameter("PWD")
   If Parameter Is Nothing Then
PWD = ""
else
   PWD = CStr(Parameter.Text)
End If
If Err Then Exit Function End If


'KND - Kind of Message
Set Parameter = Reader.RPCParameter("KND")
   If Parameter Is Nothing Then
KND = ""
else
   KND = CStr(Parameter.Text)
End If
If Err Then Exit Function End If


Jetzt haben wir alles was wir benötigen um weiter arbeiten zu können. Wir haben den Namen der Funktion und die Parameter. Mit diesen Informationen können wir nun auf unserer ASP Page eine reale Funktion aufrufen.
Diese kann auch einen anderen Namen als die MethodName besitzen. Der Lesbarkeit aber ist es sinnvoll sie genauso zu benennen wie die MethodName

Select Case MethodName
   Case "getForumList"
     Answer = getForumList(USR,PWD,KND)
   Case Else
     Answer = ""
     Exit Function
End Select

Als nächstes benötigen wir den SoapSerializer.

Set Serializer = Server.CreateObject("MSSOAP.SoapSerializer")
If Err Then Exit Function End If


Wir initialisieren den SoapSerializer mit dem Response unseres Services.

Serializer.Init Response


Stellen Sie sich mal einen Brief (body) vor der in einen Umschlag (envelope) gepackt wird.
Der Text, Absatz , ... auf dem Brief repräsentiert hier die Elemente des Serializers der die
Antwort für uns aufbereitet.

Serializer.startEnvelope
   Serializer.startBody
    Serializer.startElement MethodName & "Response", WRAPPER_ELEMENT_NAMESPACE, , "m"
     Serializer.startElement "Result"
      Serializer.writeString (Answer)
     Serializer.endElement
    Serializer.endElement
   Serializer.endBody
Serializer.endEnvelope

Process = True

End Function


Notwendige Fehlerbehandlungsroutinen

Sub ServerFault(ByVal FaultString)
   ReturnFault "Server", FaultString
End Sub

Sub ClientFault(ByVal FaultString)
   ReturnFault "Client", FaultString
End Sub

Sub ReturnFault( ByVal FaultCode, ByVal FaultString)

   On Error Resume Next

   Err.Clear

   Set Serializer = Server.CreateObject("MSSOAP.SoapSerializer")

   If Err Then
      Response.AppendToLog "Could not create SoapSerializer. " & Err.Description
   Else
      Serializer.Init Response
      Serializer.startEnvelope
      Serializer.startBody
      Serializer.startFault FaultCode, FaultString
      Serializer.startFaultDetail
      Serializer.endFaultDetail
      Serializer.endFault
      Serializer.endBody
      Serializer.endEnvelope
   End If

End Sub


Und letztendlich unsere Funktion, die uns eine Liste der Foren in Devtrain zurückgibt.
Hier können Sie beliebige Objekte, Texte, ... einbauen. Ich verwende hierzu eine eigene
Datenbankkomponente.

public function getForumList(UserID, Pwd, Kind)
   Set oFList = Server.CreateObject("ppDB.DBAccess")
       oFList.Param("userID") = cint(UserID)
       oFList.Param("pwd") = cstr(Pwd)
       oFList.Param("Art") = cint(Art)
       oFList.ExecSP "getForumList", true
   sXML = "<IntraNaut>"
   sXML = sXML & cstr(oFList.GetAsXML)
   sXML = sXML & "<IPath>" & Request.ServerVariables("HTTP_HOST") & "</IPath>"
   sXML = sXML & "</IntraNaut>"
   getForumList = sXML
end function

%>


© Copyright 2008 ppedv AG