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> |
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. 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 %> |
|
|