Я пытаюсь реализовать веб-сервис SOAP, используя asmx, который эмулирует существующий сторонний сервис.Сторонняя организация приводит пример ответа 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.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>
Обратите внимание на элемент под элементом .Это нежелательно, и я не могу найти способ предотвратить это.Я посмотрел на класс XmlRootAttribute, который позволяет мне переименовывать его, но, видимо, не пропускать его.Должен ли я отказаться от попыток сделать это с проектом asp.net, и если да, то какой другой подход будет наиболее простым?