Сериализация ответа SOAP, без корня xml - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь реализовать веб-сервис 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, и если да, то какой другой подход будет наиболее простым?

...