I've received a specification from a customer of how their web-service client works. The specification is the actual SOAP XML messages that are sent and received from the service as well as the corresponding XSD. The customer want me to implement a web-service that comply with the client. The client is written with axis2 ws-stack and what i'm trying to do is to create a web-service in WCF that will accept the requests made by the client and return a response that comply with the XML that they are expecting. In this question I will only post the XML and XSD associated with the request, because if I can get that to work, the response will be made in a similar fashion.
The XML I've received is the following:
POST /axis2/services/SampleService HTTP/1.1
Content-Type: text/xml; charset=UTF-8
SOAPAction: "sendCommand"
User-Agent: Axis2
Host: 127.0.0.1:7777
Content-Length: 347
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<SendCommandRequest xmlns="http://something.org/">
<CMD>
<Station Address="ABC">
<Platform Address="DEF">
<Command>5</Command>
</Platform>
</Station>
</CMD>
</SendCommandRequest>
</soapenv:Body>
</soapenv:Envelope>
This is what the corresponding XSD looks like:
<xsd:complexType name="SendCommandRequestType">
<xsd:sequence>
<xsd:element name="Station">
<xsd:complexType>
<xsd:attribute name="Address" type="xsd:string" use="required" />
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="Platform">
<xsd:complexType>
<xsd:attribute name="Address" type="xsd:string" use="required" />
<xsd:sequence>
<xsd:element name="Command">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="-1"/>
<xsd:enumeration value="0"/>
<xsd:enumeration value="1"/>
<xsd:enumeration value="2"/>
<xsd:enumeration value="3"/>
<xsd:enumeration value="4"/>
<xsd:enumeration value="5"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
I've started to write the types in WCF/MessageContract format, but I'm having a difficult time with lists etc, since they are double wrapped.
My MessageContracts looks like this:
[MessageContract(WrapperName = "SendCommandRequest", WrapperNamespace = "http://something.org/")]
public class SendCommandRequest
{
[MessageBodyMember(Name="CMD")]
public CMD cmd = new CMD();
}
[MessageContract(IsWrapped=false)]
public class CMD
{
[MessageBodyMember(Name="Station")]
public List<Station> stations = new List<Station>();
}
[MessageContract(IsWrapped=false)]
public class Station
{
[MessageBodyMember]
public List<Platform> platforms = new List<Platform>();
[MessageBodyMember(Name="Address")]
public String Address;
}
[MessageContract(WrapperName = "Platform")]
public class Platform
{
[MessageBodyMember(Name = "Address")]
public String Address;
}
When I use SoapUI to I get the following response from the web-service:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<SendCommandRequest xmlns="http://ttraflinariawebservice.org/">
<CMD xmlns="http://tempuri.org/" xmlns:a="http://schemas.datacontract.org/2004/07/GeldImport" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:stations>
<a:Station>
<a:Address>test</a:Address>
<a:platforms>
<a:Platform>
<a:Address>b</a:Address>
</a:Platform>
</a:platforms>
</a:Station>
</a:stations>
</CMD>
</SendCommandRequest>
</s:Body>
</s:Envelope>
As you can see it doesn't fit the XML format that the client expects. How can I get the MessageContract to comply with the XML that the client expects? I somehow need to make Lists not double wrap like they do, and the properties of the classes seems to be added to the class name.
If you want me to provide more information and code I can do so. Didn't want to fill the whole post with things which might not be relevant to the question.
EDIT:
The provided XSD file was not well formatted. In order to solve this i regenerated an XSD from the provided XML file. I then used WSCF.blue tool to generate data contract code for the XSD.
I changed so that the service contract used doc litteral formatting to comply with axis2 soap1.1
[XmlSerializerFormat(Use = OperationFormatUse.Literal, Style = OperationFormatStyle.Document, SupportFaults = true)]
[ServiceContract]
public interface MyService
I also changed the operation contract to have System.ServiceModel.Channels.Message as input and output message and then manually serialized and deserialized the xml using the generated classes (which I generated from the XSD).