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

2024-05-19

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

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

<s:Body>
    <Request version="1.0">
        <data someOtherVersion="1.1">
            ...
        </data>
    </Request>
</s:Body>

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

[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.ServiceModel.dll 中发生了类型为‘System.InvalidOperationException’的未处理异常”

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

有趣的是,将“IsWrapped”设置为 true 会产生相同的错误。有没有办法序列化消息契约类型中的 XML 属性,或者使用包装器是我们唯一的选择?


不幸的是,我发现实现这一点的唯一方法是使用包装类

[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; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MessageContract 类型中使用 XML 属性? 的相关文章

随机推荐