我试图创建一个SOAP消息来发送到SAP端点,但是,我在正确设置名称空间时遇到了问题。我试了好几天了,也尝试了很多我在网上找到的建议,但似乎都没有用。我希望你们中的一些人能帮我。
这是我所拥有的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>我试过:
但似乎什么都起不到作用。将命名空间添加到XmlElement似乎有效果,但在这种情况下,名称空间不在根元素上,也不会传播到基础元素。有什么想法吗?
发布于 2017-09-18 07:59:17
经过长时间的搜索,我终于找到了解决问题的办法。我要做的是切换到OperationContract上的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; }
}https://stackoverflow.com/questions/43863885
复制相似问题