To create the SOAP server we will need the following
ActiveX Server Component
* For this example, I use SOAP Type Library v3.0.
Code for MathFunctions.cls
The SOAP server will accept incoming SOAP messages. The
messages will be passed from our ASP listener page via the
request. The SOAP server will parse out the method call
and parameters using a SOAP Reader object. The server then
determines operation, executes and returns a SOAP response.
Option Explicit
Public Sub Load(ByVal RequestIn As ASPTypeLibrary.Request,
_
ByVal ResponseOut As
ASPTypeLibrary.Response)
Dim SOAPReader As MSSOAPLib30.SOAPReader30
Dim SOAPSerializer As MSSOAPLib30.SOAPSerializer30
Dim SOAPResult As Long
Dim RpcParameter As Long
Dim SOAPMethodCall As String
' Initialize SOAP Reader
Set SOAPReader = New MSSOAPLib30.SOAPReader30
' Load Request
SOAPReader.Load RequestIn
' Get Operation Name
SOAPMethodCall = SOAPReader.RpcStruct.baseName
' Get Parameter Value
RpcParameter = SOAPReader.RpcParameter("Number",
"uri:Math").Text
' Decide Action
Select Case SOAPMethodCall
Case "CalcSquareRoot"
SOAPResult
= CalcSquareRoot(RpcParameter)
If
(SOAPResult <> -1) Then
SendResponse
ResponseOut, SOAPResult
Else
SendFault
ResponseOut, "Client", "Invalid Input. Cannot
Take " & _
"The
Square Root Of A Negative Number"
End
If
Case "CalcFactorial"
SendResponse
ResponseOut, CalcFactorial(RpcParameter)
Case Else
SendFault
ResponseOut, "Client", "Invalid Method Call."
End Select
End Sub
' Calculate Factorial
Private Function CalcFactorial(ByVal num As Long) As Long
If num <= 1 Then
CalcFactorial
= 1
Else
CalcFactorial
= num * CalcFactorial(num - 1)
End If
End Function
' Calculate Square Root
Private Function CalcSquareRoot(ByVal num As Long) As Long
If num < 0 Then
CalcSquareRoot
= -1
Else
CalcSquareRoot
= Sqr(num)
End If
End Function
' Build and Send Response
Private Sub SendResponse(ByVal ResponseOut
As ASPTypeLibrary.Response, _
ByVal answer
As Long, ByVal SOAPMethodCall As String)
Dim SOAPSerializer As MSSOAPLib30.SOAPSerializer30
Set SOAPSerializer = New MSSOAPLib30.SOAPSerializer30
ResponseOut.ContentType = "text/xml"
SOAPSerializer.Init ResponseOut
' Build SOAP Envelope
SOAPSerializer.StartEnvelope
SOAPSerializer.StartBody
SOAPSerializer.StartElement
SOAPMethodCall & "Response", "uri:Math",
, _
"Functions"
SOAPSerializer.StartElement
"Answer", "uri:Math", , "Functions"
SOAPSerializer.WriteString
answer
SOAPSerializer.EndElement
SOAPSerializer.EndElement
SOAPSerializer.EndBody
SOAPSerializer.EndEnvelope
End Sub
' On Error Build and Send SOAP Fault
Private Sub SendFault(ByVal ResponseOut
As ASPTypeLibrary.Response, _
ByVal
FaultCode As String, ByVal FaultString As String)
Dim SOAPSerializer As MSSOAPLib30.SOAPSerializer30
Set SOAPSerializer = New MSSOAPLib30.SOAPSerializer30
ResponseOut.ContentType = "text/xml"
SOAPSerializer.Init ResponseOut
SOAPSerializer.StartEnvelope
SOAPSerializer.StartBody
SOAPSerializer.StartFault
FaultCode, FaultString
SOAPSerializer.StartFaultDetail
SOAPSerializer.EndFaultDetail
SOAPSerializer.EndFault
SOAPSerializer.EndBody
SOAPSerializer.EndEnvelope
End Sub