Я пытаюсь создать сообщение 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 дает эффект, но в этом случае пространство имен не находится в корневом элементе и не распространяется на базовые элементы. Любые идеи?