Search code examples
phpweb-servicessoapwsdlsoapui

SOAP Envelope Element is not declared


I have an issue with a SOAP request I'm sending to an external ASP Web Service. I have used both SoapUI and PHP's SoapClient class, and both times the same issue occurs - an error that tells me The 'http://www.w3.org/2003/05/soap-envelope:Envelope' element is not declared.

My Request to 'GetStudentEntitlement'

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:adm="http://dest.gov.au/Heims/Admin/" xmlns:heim="http://dest.gov.au/Heims/">
   <soap:Header/>
   <soap:Body><adm:GetStudentEntitlement>
         <heim:entitlementRequest>
            <heim:RequestControlTable>
               <heim:RequestId>CDD1E704-1298-4D42-AAD9-0031BB90329F</heim:RequestId>
               <heim:ClientOrganisationCode>7591</heim:ClientOrganisationCode>
               <heim:RequestLocalDateTime>2015-08-10T00:00:00</heim:RequestLocalDateTime>
            </heim:RequestControlTable>
            <heim:GetEntitlementIn>
               <heim:RecordId>CDD1E704-1298-4D42-AAD9-0031BB90329F</heim:RecordId>
               <heim:Chessn>1344</heim:Chessn>
               <heim:FamilyName>Bassett</heim:FamilyName>
               <heim:BirthDate>1988-05-21</heim:BirthDate>
            </heim:GetEntitlementIn>
         </heim:entitlementRequest>
      </adm:GetStudentEntitlement>
   </soap:Body>
</soap:Envelope>

The response:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <soap:Fault>
         <soap:Code>
            <soap:Value>soap:Sender</soap:Value>
         </soap:Code>
         <soap:Reason>
            <soap:Text xml:lang="en">Heims.WebServices.Extensions.Exceptions.XmlSchemaValidationException: Schema validation errors
   at Heims.WebServices.Extensions.SoapFilterExtension.ValidateXmlMessage(SoapMessage message, WebMethodSettings methodSettings) in c:\Userdata\HEIMS.NET\Source\Development\WebService\Heims.WebService.Common\Extensions\SoapFilterExtension.cs:line 408
   at Heims.WebServices.Extensions.SoapFilterExtension.ProcessMessageBeforeDeserialise(SoapMessage message) in c:\Userdata\HEIMS.NET\Source\Development\WebService\Heims.WebService.Common\Extensions\SoapFilterExtension.cs:line 200
   at Heims.WebServices.Extensions.SoapFilterExtension.ProcessMessage(SoapMessage message) in c:\Userdata\HEIMS.NET\Source\Development\WebService\Heims.WebService.Common\Extensions\SoapFilterExtension.cs:line 173
   at System.Web.Services.Protocols.SoapMessage.RunExtensions(SoapExtension[] extensions, Boolean throwOnException)
   at System.Web.Services.Protocols.SoapServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()</soap:Text>
         </soap:Reason>
         <detail>
            <ValidationError>
               <RecordId/>
               <Element>Envelope</Element>
               <Line>1</Line>
               <Column>2</Column>
               <Description>The 'http://www.w3.org/2003/05/soap-envelope:Envelope' element is not declared.</Description>
            </ValidationError>
         </detail>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

I have tried adding and removing the trailing / on the :soap declaration, as well as trying both the 1.1 and 1.2 SOAP versions offered by this web service.

This endpoint request to 'Ping' works correctly:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:adm="http://dest.gov.au/Heims/Admin/">
   <soap:Header/>
   <soap:Body>
      <adm:Ping/>
   </soap:Body>
</soap:Envelope>

The result is returned as expected:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <PingResponse xmlns="http://dest.gov.au/Heims/Admin/">
         <PingResult>Heims web services pinged. DateTime = 2015-08-10 11:11:00:05</PingResult>
      </PingResponse>
   </soap:Body>
</soap:Envelope>

So why would the code for one request (the ping) work perfectly, while the other request (GetStudentEntitlement) fails? Both have the soap:Envelope declaration, but the Ping request works fine.

I have also tried using xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" in the soap:Envelope element, but the error remained.

Is it possible that this is a server-side issue from the Web Service itself? Or is something simply going wrong in my code?


Solution

  • Answering my own question.

    I contact the Government IT Assistance directly, and had them send me a code example. They were using a highly unusual and modified form of <soap wrapper, forcing me to manually generate the XML using SimpleXMLElement and submit to the Web Service using a wrapped SoapVar with the XSD_ANYXML type.