首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向MessageContract (WCF)添加名称空间

向MessageContract (WCF)添加名称空间
EN

Stack Overflow用户
提问于 2017-05-09 07:36:32
回答 1查看 1.6K关注 0票数 0

我试图创建一个SOAP消息来发送到SAP端点,但是,我在正确设置名称空间时遇到了问题。我试了好几天了,也尝试了很多我在网上找到的建议,但似乎都没有用。我希望你们中的一些人能帮我。

这是我所拥有的C#代码的一个例子:

代码语言:javascript
复制
[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体看起来如下所示:

代码语言:javascript
复制
<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)的结果:

代码语言:javascript
复制
<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似乎有效果,但在这种情况下,名称空间不在根元素上,也不会传播到基础元素。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-18 07:59:17

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

代码语言:javascript
复制
[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; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43863885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档