首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MessageContract类型中使用XML属性?

如何在MessageContract类型中使用XML属性?
EN

Stack Overflow用户
提问于 2014-07-28 15:20:04
回答 2查看 2.1K关注 0票数 6

前面的注意事项:我不能更改传入的SOAP请求的格式,因为它们是由国际标准(weeeeeeeee)固定的。

我的WCF服务中有一个SOAP请求,如下所示:

代码语言:javascript
复制
<s:Body>
    <Request version="1.0">
        <data someOtherVersion="1.1">
            ...
        </data>
    </Request>
</s:Body>

到目前为止,我们一直在直接使用System.ServiceModel.Channels.Message对象,这有点痛苦。我们正在尝试使用如下所示的强类型:

代码语言:javascript
复制
[MessageContract(IsWrapped = false)]
public class Request
{
    [MessageBodyMember]
    [XmlAttribute("version")]
    public string Version;

    [MessageBodyMember]
    [XmlElement("data")]
    public SomeOtherType Data;
}

[MessageContract(IsWrapped = false)]
public class Response
{
    [MessageBodyMember]
    [XmlAttribute("version")]
    public string Version;

    [MessageBodyMember]
    [XmlElement("data")]
    public SomeOtherType ResponseData;
}

[ServiceContract]
[XmlSerializerFormat]
public interface Service
{
    [OperationContract(Action = "request", ReplyAction = "response")]
    Response ServiceOperation(Request req);
}

不幸的是,当我们尝试启动时,我们会发现一个错误:“System.InvalidOperationException类型的未处理异常发生在System.ServiceModel.dll中

附加信息: System.Xml.Serialization.XmlAttributeAttribute属性XmlSerializer在版本中无效。当XmlElement、XmlArray、XmlArrayItem和XmlAnyElement属性为false时,MessageContract只支持IsWrapped。“

有趣的是,将"IsWrapped“设置为true会产生同样的错误。是否有一种方法来序列化消息契约类型中的XML属性,还是在这里使用wrappers的唯一选项?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-12 16:48:33

不幸的是,我发现实现这一目标的唯一方法是使用包装器类。

代码语言:javascript
复制
[MessageContract(IsWrapped = false)]
public class Response
{
    [MessageBodyMember(Name = "Response", Namespace = "Http://example.org/ns1")]
    public ResponseBody Body { get; set; }

    public Response(){}


    public Response(ResponseBody body)
    {
        Body = body;
    }
}

[XmlType(AnonymousType = true, Namespace = "Http://example.org/ns1")]
public class ResponseBody
{
    [XmlAttribute(AttributeName = "version")]
    public string Version { get; set; }

    [XmlElement(ElementName = "data", Namespace = "Http://example.org/ns1")]
    [MessageBodyMember]
    public SomeOtherType ResponseData { get; set; }
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-28 22:06:21

尝试使用XmlElement(类型(数据))

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24998525

复制
相关文章

相似问题

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