Поведение WCF DataContractSerializer

Я наблюдаю необычное поведение при использовании DataContractSerializer. Я определил контракт сообщения следующим образом:

namespace MyNamespace.DataContracts
{
[MessageContract(WrapperName = "order", WrapperNamespace = @"http://example.com/v1/order")]
public class MyOrder
{
    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 1)]
    public MyStore store;

    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 2)]
    public MyOrderHeader orderHeader;

    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 3)]
    public List<MyPayment> payments;

    [MessageBodyMember(Namespace = @"http://example.com/v1/order", Order = 4)]
    public List<MyShipment> shipments;
}
.
.

Я отправляю ему XML-сообщение, которое выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<order xmlns="http://example.com/v1/order>
    <store>
    ...
    </store>
    <orderHeader>
    ...
    </orderHeader>
    <payments>
        <payment>
        ...
        </payment>
    </payments>
    <shipments>
        <shipment>
        ...
        </shipment>
    </shipments>
</order>

Моя служба десериализует этот XML, как и ожидалось. Внутри моего сервиса я использую DataContractSerializer для создания строки XML, и тут все становится странным. Я использую сериализатор следующим образом:

DataContractSerializer serializer = new DataContractSerializer(typeof(MyOrder));

using (MemoryStream ms = new MemoryStream())
{
    serializer.WriteObject(ms, order);                    
    ms.Position = 0;
    StreamReader sr = new StreamReader(ms);
    string outputMessage = sr.ReadToEnd();
}

Когда это завершится, outputMessage будет содержать следующий XML:

<?xml version="1.0" encoding="utf-8"?>
    <MyOrder xmlns="http://example.com/v1/order" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <order>
            <store>
            ...
            </store>
            <orderHeader>
            ...
            </orderHeader>
            <payments>
                <payment>
                ...
                </payment>
            </payments>
            <shipments>
                <shipment>
                ...
                </shipment>
            </shipments>
        </order>
    </MyOrder>

Излишне говорить, что все, что ожидает получить исходное XML-сообщение, не сможет его проанализировать. Итак, я думаю, у меня есть два вопроса:

  1. Почему DataContractSerializer добавляет дополнительный внешний узел к выходным данным XML?
  2. Есть ли способ остановить это?

Спасибо.

Я, вероятно, должен добавить, что это с .NET 4.


person Community    schedule 20.05.2010    source источник


Ответы (1)


Вы можете попробовать использовать WriteObjectContent вместо WriteObject, но я не могу воспроизвести вашу проблему, используя предоставленный вами код. Все определения дополнительных классов, которые являются частью вашего контракта сообщений, пусты в моем определении, но я получаю такой XML:

<MyOrder xmlns="http://schemas.datacontract.org/2004/07/SandboxApp"
         xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <orderHeader i:nil="true"/>
    <payments i:nil="true"/>
    <shipments i:nil="true"/>
    <store i:nil="true"/>
</MyOrder>

Что также кажется странным, поскольку игнорирует WrapperName. Тот же результат в .NET 3.5 SP1 и .NET 4.0.

person Thorarin    schedule 20.05.2010
comment
Все подэлементы в моем MessageContract определяются классами с атрибутами DataContract/DataMember. - person ; 20.05.2010
comment
Я испортил пасту в своем исходном посте. В некоторых пространствах имен есть дополнительный http://. Попробуйте это вместо этого. pastebin.com/FqBGVGLK - person ; 20.05.2010
comment
@sbanwart: я тоже облажался :) Я случайно вставил все классы в свой класс Program ... Теперь я получаю точно такой же результат, как и в .NET 3.5. PS: косые черты не нужно экранировать в обычных строках, это просто обратные косые черты. Так что @ не нужно. - person Thorarin; 20.05.2010