我正在尝试创建要发送到 SAP 端点的 SOAP 消息,但是,我无法正确设置命名空间。我已经尝试了几天,并尝试了很多我在网上找到的建议,但似乎没有一个有效。我希望你们中的一些人可以帮助我。
这是我拥有的 C# 代码示例:
[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
- 在将新命名空间添加到命名空间集合的 getter/setter 上使用“XmlNamespaceDeclarations”属性
- 在 OperationContract 上设置命名空间
但似乎没有任何效果。将命名空间添加到 XmlElement 似乎有效果,但在这种情况下,命名空间不在根元素上,也不会传播到底层元素。有任何想法吗?