WCF and Input Parameter Order in SOAP Envelope
Asked Answered
T

2

8

I'm getting an Object reference not set to an instance of object error in my WCF web service which uses webHttpBinding (soap 1.1) I have noticed that if you have the input parameters in a certain order the error does not get raised.

i.e.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:not="http://schemas.globalfoundries.com/NotificationService">
   <soapenv:Header/>
   <soapenv:Body>
      <not:NotifyWorkflowItemUpdate>
         <not:userIDs>testUserID</not:userIDs>
         <not:taskID>testTaskID</not:taskID>
         <not:taskType>testTaskType</not:taskType>
         <not:status>testStatus</not:status>
         <not:appID>testAppID</not:appID>
         <not:message>testMessage</not:message>
      </not:NotifyWorkflowItemUpdate>
   </soapenv:Body>
</soapenv:Envelope>

However if I change the order of the input parameters in the request template I get the aforementioned error. i.e. (note message and userIDs parameters are switched)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:not="http://schemas.globalfoundries.com/NotificationService">
   <soapenv:Header/>
   <soapenv:Body>
      <not:NotifyWorkflowItemUpdate>
     <not:message>testMessage</not:message>
         <not:taskID>testTaskID</not:taskID>
         <not:taskType>testTaskType</not:taskType>
         <not:status>testStatus</not:status>
         <not:appID>testAppID</not:appID>
         <not:userIDs>testUserID</not:userIDs>
      </not:NotifyWorkflowItemUpdate>
   </soapenv:Body>
</soapenv:Envelope>

Why is this happening? Are request parameters mapped to the .Net method parameters via the order and not by the names? Is there an attribute that I have to specify on the service contract to make named parameter mapping possible?

Trivial answered 26/7, 2012 at 10:56 Comment(0)
E
11

You need to use XmlSerializerFormat class in your WCF service interface.

[ServiceContract, XmlSerializerFormat]
public interface IGoodMessageService
{
    ...
}

Problem and solution is explained in this link: http://neimke.blogspot.com.tr/2012/03/serialization-ordering-causes-problems.html

Endoplasm answered 26/6, 2014 at 5:38 Comment(1)
Yes please add some explanation as well if you can, I will accept this as the answer. Waited two years for the answer though :DTrivial
G
5

The XML schema of your SOAP message specifies the order. In XML order of element matters and WCF is validating the XML against the schema.

Grained answered 26/7, 2012 at 11:40 Comment(3)
Is there any way to use something like named parameters so that the consuming client can specify the parameters in any order as long as the correct names are specified in the tags?Trivial
I don't think so. The SOAP and XSD are well defined standards designed for interoperability. Don't think SOAP as methods and parameters because your language generates proxies. Think it as message passing and the contract of that message is validated strictly.Grained
I just posted the same question, only I added that in ASMX, the ordering does NOT matter. I would think there would be a setting in WCF that would allow you to mimic the unordered feature in ASMX.Basiliabasilian

© 2022 - 2024 — McMap. All rights reserved.