WSDL - allow different order of DataMembers for SOAP messages

Viewed 20

We use ServiceStack 5.9.2.

DTO:

    [DataContract]
    [Restrict(Usage.SoapOnly)]
    public class GetDocumentations : Documentations
    {

    }

    [DataContract]
    [Api("Abfrage auf von geplanten zu dokumentierenden Interventionen")]
    public class Documentations
    {
        [DataMember]
        [ApiMember(Description = "Ist dieses Feld gesetzt werden nur die Interventionen abgefragt, die sich seit dem letzten Acknowledge geändert haben.")]
        public bool? OnlyChanged { get; set; }
        
        [DataMember]
        public DocumentationType Type { get; set; }

        [DataMember]
        public int[] SubTypeIds { get; set; }

        [DataMember]
        public int[] CustomerIds { get; set; }

        [DataMember(IsRequired = true)]
        public DateTime From { get; set; }

        [DataMember(IsRequired = true)]
        public DateTime To { get; set; }

        [DataMember]
        [ApiMember(Description = "Die Ergebnismenge wird auf x Elemente eingeschraenkt.")]
        public int? Limit { get; set; }
    }

resulting WSDL snipped:

    <xs:complexType name="Documentations">
      <xs:sequence>
        <xs:element minOccurs="0" name="CustomerIds" nillable="true" xmlns:q28="http://schemas.microsoft.com/2003/10/Serialization/Arrays" type="q28:ArrayOfint" />
        <xs:element name="From" type="xs:dateTime" />
        <xs:element minOccurs="0" name="Limit" nillable="true" type="xs:int" />
        <xs:element minOccurs="0" name="OnlyChanged" nillable="true" type="xs:boolean" />
        <xs:element minOccurs="0" name="SubTypeIds" nillable="true" xmlns:q29="http://schemas.microsoft.com/2003/10/Serialization/Arrays" type="q29:ArrayOfint" />
        <xs:element name="To" type="xs:dateTime" />
        <xs:element minOccurs="0" name="Type" type="tns:DocumentationType" />
      </xs:sequence>
    </xs:complexType>

enforces that the order in the incoming soap request is like defined:

<?xml version="1.0" encoding="UTF-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap12:Body>
        <GetDocumentations xmlns="http://schemas.datacontract.org/2004/07/Company" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <From>2014-01-01T00:00:00</From>
            <Limit>100</Limit>
            <OnlyChanged>false</OnlyChanged>
            <To>2100-01-01T00:00:00</To>
            <Type>CarePlan</Type>
        </GetDocumentations>
    </soap12:Body>
</soap12:Envelope>

That works, but the following not, because the Limit Property is at a different position:

<?xml version="1.0" encoding="UTF-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap12:Body>
        <GetDocumentations xmlns="http://schemas.datacontract.org/2004/07/Company" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <From>2014-01-01T00:00:00</From>
            <OnlyChanged>false</OnlyChanged>
            <To>2100-01-01T00:00:00</To>
            <Type>CarePlan</Type>
            <Limit>100</Limit>
        </GetDocumentations>
    </soap12:Body>
</soap12:Envelope>

Here the limit is ignored. Means: It is not mapped to it's property.

Change the xs:sequence to xs:all would fix that. How can we reach that? Or is there a better solution? The problem occures for many DTO's.

1 Answers

You can change the Order in which fields should be serialized & deserialized with the DataMember Order property, but the DataContractSerializer doesn't support accepting them being deserialized in any order.

Related