将名称空间添加到MessageContract(WCF)

时间:2017-05-09 07:36:33

标签: c# xml wcf soap messagecontract

我正在尝试创建一个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>

我试过了:

  • 将XmlRoot添加到MessageContract
  • 将XmlType添加到MessageContract
  • 使用&#34; XmlNamespaceDeclarations&#34; getter / setter上的属性,其中新命名空间被添加到命名空间集合
  • 在OperationContract上设置命名空间

但似乎没有任何效果。将命名空间添加到XmlElement似乎有效,但在这种情况下,命名空间不在根元素上,也不会传播到底层元素。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

经过长时间的搜索,我终于找到了解决问题的方法。我必须做的是切换到OperationContract上的XmlSerializerFormat而不是接口本身并相应地更新合同:

[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; }
}