Library tutorials & articles

XML SOAP

The Server

Our server needs to be configured to accept the HTTP post sent by the client. It will be noted that we direct the client’s post to a URL on our local server – http://localhost/soap.asp. So our first job is to create this page, to listen for, and process, SOAP calls to our server. We know that our ASP will receive an XML document, in the form of an HTTP post, with a method name (GetSalesTax), and a parameter (SalesTotal). So, to write our basic listener service, all we need do is deconstruct the body of the request (the SOAP envelope) and pull out the value of the SalesTotal parameter.

The SOAP envelope posted by the client is contained in the body of the request, or in ASP terms the Request object; and because it is XML, we can load it into an instance of Microsoft’s XMLDOM in our ASP. Soap.asp begins like this:

Set objReq = Server.CreateObject("Microsoft.XMLDOM")

objReq.Load Request

Thus objReq contains the SOAP envelope we created on the client, and we can extract the value of the SalesTotal parameter by running an XSL pattern query, using the SelectSingleNode method of the XML DOM object :

strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTax/SalesTotal" varSalesTotal = objReq.SelectSingleNode(strQuery).Text

With the parameter extracted, we can make our calculation to get the sales-tax:

varSalesTax = varSalesTotal * 0.04

Now we have the return value for sales-tax – the response - ready to pass back to the client, but as with the request, we need to format this response correctly, in order to comply with the SOAP standard. The SOAP response envelope conforms to a format-type identical to the request. The only difference is that the “IN” parameter (SalesTotal, in our case) is replaced by an “OUT” parameter – SalesTax, and the method name indicates that the document is a response:

<SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
   <SOAP:Header></SOAP:Header>
   <SOAP:Body>
      <m:GetSalesTaxResponse xmlns:m="urn:myserver/soap:TaxCalc">
         <SalesTax>4</SalesTax>
      </m:GetSalesTaxResponse>
   </SOAP:Body>
</SOAP:Envelope>

We can build up this document, either by string-concatenation, or by creating a new instance of a DOM, and appending the appropriate nodes.

Back on the client, the response is received, and can be decoded by extracting the appropriate node from the Envelope document:

Dim objReturn As New MSXML.DomDocument
objReturn.LoadXML strReturn
strQuery = _
  "SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
dblTax = objReturn.SelectSingleNode(strQuery).Text

And that’s it! A functional, compliant SOAP service in a few easy steps. Of course, the service that we have provided is far from sophisticated, but that is to miss the point. In the not-too-distant future, Visual Studio 7 will completely mask the implementation of SOAP; but I believe that there is value in understanding the way the engine turns beneath the hood. SOAP itself is a very simple protocol; and I hope you leave this article with a better understanding the infrastructure that lies behind SOAP, and the methodology through which SOAP-based component services are going to be provided in the future.

Comments

  1. 19 May 2004 at 16:42

    Quote:
    [1]Posted by kpma_l on 19 May 2004 04:05 PM[/1]
    I tried to copy the the code and add references to VB project and run the VB app. but get runtime error at the DOMDocument object accesing a single node.


    Run time error 91.


    MSXML2 and MTS Admin are the references I have added.



    HELP!


    Thanks ....




    OK looks like it was the problem where the objReturn.selectSingleNode(strQuery).Text  did not have anything returned that we get Object or with block variable not set.


    More details at http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q283803&


    Now I need to get back to look at why it was not returning anything ....

  2. 19 May 2004 at 16:05

    I tried to copy the the code and add references to VB project and run the VB app. but get runtime error at the DOMDocument object accesing a single node.


    Run time error 91.


    MSXML2 and MTS Admin are the references I have added.



    HELP!


    Thanks ....

  3. 01 Apr 2004 at 17:16

    In .NET web services; How to monitor from where (mostly his/her web site URL but not his/her machine IP) requester is consuming the web service? Techies, 'HTTP_REFERER' and 'URLReferrer'  shows null  please, suggest any other possibilities.

  4. 01 Apr 2004 at 17:13

    Great work by ComponentSource and  they have very well explained VB 6.0 client and access to web service. I have a question here. How to monitor from where (mostly his/her web site URL not his/her machine IP) requester is consuming the web service? Techies, 'HTTP_REFERER' shows null  please, suggest any other possibilities.


    Thanks

  5. 20 Nov 2003 at 14:09

    if anyone knows the meaning of this, i could use the feedback.  my hunch is, that the SOAP server is not configured to handle the request properly.  but i dunno...  =)

  6. 20 Nov 2003 at 07:03

    Can any one help me to identify the references and dlls required to run this code.
    I want to register the dlls required and then run this code in VB4.0.
    I know i need msxml.dll and the other one is it mssoap1.dll ?
    if thats the one where do i get it from?


    thanks in advance.

  7. 17 Oct 2003 at 16:10

    I copied all the code and followed all the instructions (including making sure the xml tags were all in the same case) and all I could get back from the soap request was ?????????????????????? etc etc with the odd † or - or = character thrown in.  2216 characters in all.  I'm using vb 6 and msxml4.
    Any suggestions?  Did anyone get this to work?

  8. 25 Aug 2003 at 05:22

    Hi all


    to use this example with msxml 2.0 or higher
    change


    "msxml.xmlhttprequest"


    to:


    "msxml2.xmlhttp"
    or
    "msxml2.xmlhttp26"
    or
    "msxml2.xmlhttp30"
    ...
    hth
    bye

  9. 06 Jun 2003 at 03:36

    Hi.
    can u tell me how to fix the "dblTax = objReturn.selectSingleNode(strQuery).Text" error..pliz e.mail me

  10. 03 Jun 2003 at 04:00

    I noticed that your code appears to have been written in VB6, if this is so then a possible cause of your issues is the declarations as new.  Try changing your as new statements to be just as classname and then before you use it say set myobject = new ServerXMLHTTPClass or whatever class you are creating.  VB6 handled the as new statement in a way which was not always reliable and this has caused me issues before.

  11. 02 Jun 2003 at 03:32

    Hi,


    I Am New To SOAP Through VB. I am getting following error


    " Method 'Send' Of 'IXMLHTTPRequest' Failed".


    Error Number := -2146697211
    .


    I am sending you the code for consideration.


    Option Explicit
      Dim objHTP As New MSXML.XMLHTTPRequest
      Dim strEnvelope As String
      Dim strreturn As String
      Dim objReturn As New MSXML.DOMDocument
      Dim dblTax As Double
      Dim strQuery As String
    ''Declaration Ends Here
    Private Sub taxcal()
    'Create SOAP Envelope
    strEnvelope = ""
    strEnvelope = "<soap : envelope xmlns:soap=""urn:schemas-xmlsoap-org:soap.v1"">" & _
    "<soap : header> </soap : header>" & _
    "<soap : Body>" & _
    "<m:getsalestax xmlns: m=""urn:myserver/soap:TaxCalculator"">" & _
    "<salestotal>" & Val(txt
    Sale.Text) & "<salestotal>" & _
    "</m:getsalestax>" & _
    "</Soap: Body>" & _
    "</Soap: Envelope>"
    'Setup To Post To Our Local Server
    objHTP.open "post", "http://localhost/soap.asp", False
    'Set A Standard SOAP / XML Header For The Content-Type
    objHTP.setRequestHeader "Content-Type", "text/xml"
    'Set A Header For The Method To Be Called
    objHTP.setRequestHeader "SOAPMethodName", "urn:myserver/soap:Taxcalcultor#GetSalesTax"
    'Make The SOAP Call
    objHTP.send strEnvelope
    'Get The Return Envelope
    strreturn = objHTP.responseText
    'Load The Return Envelope Into A DOM
    objReturn.loadXML strreturn
    'Query The Return Envelope
    strQuery = "SOAP:Envelope/SOAP:Body/m:GetSalesTaxResponse/SalesTax"
    dblTax = objReturn.selectSingleNode(strQuery).Text
    txt_Tax.Text = dblTax
    End Sub

  12. 01 Jun 2003 at 22:39

    I was wondering if someone could help me with my problem.  I am using code very similar to the XML Soap in my application and it communicates succesfully when used as a windows application and as an ASP.NET project but when I try and use the same method from my Windows Service I get the exception message QueryInterface for interface 'XMLHTTPRequest' has failed when I try to execute myobject.Open ...  The type of exception is an invalid cast exception even though the object was declared as new XMLHttpRequest.


    Following suggestions from some web sites I put the line :
    Threading.Thread.CurrentThread.ApartmentState = Threading.ApartmentState.STA


    Apparently activex applications can't handle multi-threaded communication properly but this didn't stop my error from occurring.  The above line I placed in my Onstart event and even tried in my New event with no success.  The time at which the XMLHttpRequest is fired off is after onstart in my timer_tick event.

  13. 25 Oct 2002 at 22:19

    I am a beginner of SOAP & XML
    I copy and save Soap.asp  to Win2000 Server wwwroot ,
    then Copy Souce code of VB Client to run , but occure some error?


    dblTax = objReturn.selectSingleNode(strQuery).Text


    the strQuery is not correct format,what error?

  14. 16 Sep 2002 at 12:56

    Error in VB code. dblTax = objReturn.selectSingleNode(strQuery).Text
    Return nothing becuase strQuery Xpath expression is case sensitive an its case doen not match whats been generated by ASP page . Eg return XML is "<soap.......
    where as whats been checked in VB is <"SOAP............ A mismatch in Case


  15. 16 Sep 2002 at 12:10

    Set objReq = Server.CreateObject("Microsoft.XMLDOM")
    creates the object but for some reason objReq.SelectSingleNode says "Object Required"


    changed above line to
    Set objReq = Server.CreateObject("MSXML2.DOMDocument")
    and everything  worked

  16. 01 Jan 1999 at 00:00

    This thread is for discussions of XML SOAP.

Leave a comment

Sign in or Join us (it's free).

AddThis

Related podcasts

  • ASP.NET Caching and Performance

    Steve Smith, owner of ASP Alliance and Lake Quincy Media joins us today to teach us about some hidden gems in ASP.NET caching and performance. Steve’s expertise in this area comes from first-hand experience as Lake Quincy’s ad system serves over 60 requests per second and handles over 150 million...

Related jobs