Добавление пространства имен в MessageContract (WCF)

Я пытаюсь создать сообщение SOAP для отправки на конечную точку SAP, однако у меня возникают проблемы с правильной настройкой пространства имен. Я пытался в течение нескольких дней и пробовал много предложений, которые я нашел в Интернете, но ни одно из них не работает. Я надеюсь, что некоторые из вас могут мне помочь.

Это пример кода С#, который у меня есть:

[ServiceContract]
[XmlSerializerFormat]
public interface IWcfClient
{
    [OperationContract(IsOneWay = true)]
    void SendUpdates(UpdateRequest request);
}

[MessageContract(IsWrapped = true, WrapperName = "MyRoot", WrapperNamespace = "myNamespace")]
public class UpdateRequest
{
    [MessageBodyMember]
    [XmlElement(ElementName = "updateType")]
    public byte UpdateType { get; internal set; }

    [MessageBodyMember]
    [XmlElement(ElementName = "updateEntry")]
    public UpdateEntry[] UpdateEntries { get; set; }
}

public class UpdateEntry
{
    [XmlElement]
    public string DeviceId { get; set; }

    [XmlElement]
    public DateTime LastSeen { get; set; }
}

В результате тело SOAP выглядит примерно так:

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <MyRoot xmlns="myNamespace">
        <updateEntry>
            <DeviceId>12345</DeviceId>
            <LastSeen>2017-04-24T14:44:30.8030649Z</LastSeen>
        </updateEntry>
        <updateEntry>
            <DeviceId>56789</DeviceId>
            <LastSeen>2017-05-03T01:33:02.084Z</LastSeen>
        </updateEntry>
        <updateType>2</updateType>
    </MyRoot>
</s:Body>

Чего я пытаюсь добиться, так это добавить еще одно пространство имен в корень и использовать подэлементы этого пространства имен. В конечном итоге я ищу результат, подобный этому (mySecondNamespace):

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <MyRoot xmlns="myNamespace" xmlns:a="mySecondNamespace">
        <a:updateEntry>
            <a:DeviceId>12345</a:DeviceId>
            <a:LastSeen>2017-04-24T14:44:30.8030649Z</a:LastSeen>
        </a:updateEntry>
        <a:updateEntry>
            <a:DeviceId>56789</a:DeviceId>
            <a:LastSeen>2017-05-03T01:33:02.084Z</a:LastSeen>
        </a:updateEntry>
        <a:updateType>2</a:updateType>
    </MyRoot>
</s:Body>

Я пытался:

  • Добавление XmlRoot в MessageContract
  • Добавление XmlType в MessageContract
  • Использование атрибута «XmlNamespaceDeclarations» в методе получения/установки, в котором новое пространство имен добавляется в коллекцию пространств имен.
  • Установка пространства имен в OperationContract

Но ничего не работает. Кажется, что добавление пространства имен в XmlElement дает эффект, но в этом случае пространство имен не находится в корневом элементе и не распространяется на базовые элементы. Любые идеи?


person Stitch10925    schedule 09.05.2017    source источник


Ответы (1)


После долгих поисков я наконец нашел решение своей проблемы. Что мне нужно было сделать, так это переключиться на XmlSerializerFormat в OperationContract вместо самого интерфейса и соответствующим образом обновить контракты:

[ServiceContract]
public interface IWcfClient
{
    [XmlSerializerFormat]
    [OperationContract(IsOneWay = true)]
    void SendUpdates(UpdateRequest request);
}

[MessageContract(IsWrapped = false)]
public class UpdateRequest
{
    [MessageBodyMember(Name="UpdateEntry")]
    public UpdateEntry[] UpdateEntries { get; set; }
}

[Serializable]
[XmlType(Namespace = "myNamespace")]
public class UpdateEntry
{
    [XmlElement(ElementName = "UpdateEntry", Order = 0)]
    public Device[] DeviceInfo { get; set; }

    [XmlElement(ElementName = "UpdateType", Order = 1)]
    public byte UpdateType { get; set; }
}

[Serializable]
[XmlType(Namespace = "myNamespace")]
public class Device
{
    [XmlElement(ElementName = "DeviceId", Order = 0)]
    public string DeviceId { get; set; }

    [XmlElement(ElementName = "LastSeen", Order = 1)]
    public DateTime LastSeen { get; set; }
}
person Stitch10925    schedule 18.09.2017