Calling ASP.NET web service from ASP using SOAPClient

13,630

Solution 1

I solved this:

The SOAP client request node was picking up the default namespace from:

<ProcessMessage xmlns="http://internalservice.net/messageprocessing">

Adding an empty default namespace to the XML sent by the ASP client overrides this behaviour:

xmlMessage = "<request xmlns=''><task>....various xml</task></request>"

Solution 2

Kev,

I found the solution, but its not trivial.

You need to create a custom implementation of IHeaderHandler that creates the proper headers.

There is a good step by step here:

http://msdn.microsoft.com/en-us/library/ms980699.aspx

EDIT: I saw your update. Nice workaround, you might want to bookmark this link regardless :D

Share:
13,630
Kev
Author by

Kev

###Actively looking for freelance work ###About Me: I'm a professional software developer and have spent my time building provisioning and web based self-service systems for IIS, Apache and Citrix XenServer, amongst other things. My Curriculum Vitae can be viewed on Stack Overflow Careers (might be a bit out of date). Stuff I like to listen to at last.fm You can get in touch here: kevin.e.kenny #@# gmail.com (you know what to do with the # and spaces). No Survey Emails Please. Also not ashamed to admit I like trains, mostly diesels, late Era 8 (BR Sectorisation) and Era 9 onwards :) I'm also interested in signalling if anyone from Network Rail is looking this far down ;)

Updated on June 04, 2022

Comments

  • Kev
    Kev almost 2 years

    I have an ASP.NET webservice with along the lines of:

    [WebService(Namespace = "http://internalservice.net/messageprocessing")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class ProvisioningService : WebService
    {
        [WebMethod]
        public XmlDocument ProcessMessage(XmlDocument message)
        {
            // ... do stuff
        }
    }
    

    I am calling the web service from ASP using something like:

    provWSDL = "http://servername:12011/MessageProcessor.asmx?wsdl"
    Set service = CreateObject("MSSOAP.SoapClient30")
    service.ClientProperty("ServerHTTPRequest") = True
    Call service.MSSoapInit(provWSDL)
    
    xmlMessage = "<request><task>....various xml</task></request>"
    result = service.ProcessMessage(xmlMessage)
    

    The problem I am encountering is that when the XML reaches the ProcessMessage method, the web service plumbing has added a default namespace along the way. i.e. if I set a breakpoint inside ProcessMessage(XmlDocument message) I see:

    <request xmlns="http://internalservice.net/messageprocessing">
      <task>....various xml</task> 
    </request>
    

    When I capture packets on the wire I can see that the XML sent by the SOAP toolkit is slightly different from that sent by the .NET WS client. The SOAP toolkit sends:

    <SOAP-ENV:Envelope 
        xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" 
        xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" 
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Body>
            <ProcessMessage xmlns="http://internalservice.net/messageprocessing">
                <message xmlns:SOAPSDK4="http://internalservice.net/messageprocessing">
                    <request>
                        <task>...stuff to do</task>
                    </request>
                </message>
            </ProcessMessage>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    Whilst the .NET client sends:

    <soap:Envelope 
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <soap:Body>
            <ProcessMessage xmlns="http://internalservice.net/messageprocessing">
                <message>
                    <request xmlns="">
                        <task>...stuff to do</task>
                    </request>
                </message>
            </ProcessMessage>
        </soap:Body>
    </soap:Envelope>
    

    It's been so long since I used the ASP/SOAP toolkit to call into .NET webservices, I can't remember all the clever tricks/SOAP-fu I used to pull to get around stuff like this.

    Any ideas? One solution is to knock up a COM callable .NET proxy that takes the XML as a string param and calls the WS on my behalf, but it's an extra layer of complexity/work I hoped not to do.