我正在尝试使用asmx来实现SOAP Web服务,该服务模仿现有的第三方服务。第三方给出了一个示例SOAP响应(简化):
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP:Body>
<ns:PlaceOrderResponse xmlns:ns="http://www.some-company.co/ordering">
<ns:Header>
<ns:OrderID>1234567890</ns:OrderID>
<ns:OrderAccepted>Y</ns:OrderAccepted>
</ns:Header>
<ns:ResponseLine>
...
</ns:ResponseLine>
<ns:ResponseLine>
...
</ns:ResponseLine>
</ns:PlaceOrderResponse>
</SOAP:Body>
</SOAP:Envelope>
关于响应的两件事“有趣”: 1)在包含Header元素和ResponseLine元素的元素下没有ROOT NODE。 2)ResponseLine元素没有根(这不是问题,因为可以使用XmlElementAttribute对其进行控制)。
这是我的尝试:
[WebMethod]
public OrderResponse PlaceOrder(...)
其中OrderResponse定义为
public class OrderResponse
{
[XmlElement("Header", Order = 1)]
public orderHeader Header { get; set; }
[XmlElement("OrderLine", Order = 2)]
public List<responseLine> responseLines;
}
由此生成的SOAP如下所示:
<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>
<PlaceOrderResponse xmlns="http://www.some-company.co/ordering">
<PlaceOrderResult>
<Header>
<OrderID>1234567890</OrderID>
<OrderAccepted>Y</OrderAccepted>
</Header>
<OrderLine>
...
</OrderLine>
<OrderLine>
...
</OrderLine>
</PlaceOrderResult>
</PlaceOrderResponse>
</soap:Body>
</soap:Envelope>
请注意