前面的注意事项:我不能更改传入的SOAP请求的格式,因为它们是由国际标准(weeeeeeeee)固定的。
我的WCF服务中有一个SOAP请求,如下所示:
<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.InvalidOperationException类型的未处理异常发生在System.ServiceModel.dll中
附加信息: System.Xml.Serialization.XmlAttributeAttribute属性XmlSerializer在版本中无效。当XmlElement、XmlArray、XmlArrayItem和XmlAnyElement属性为false时,MessageContract只支持IsWrapped。“
有趣的是,将"IsWrapped“设置为true会产生同样的错误。是否有一种方法来序列化消息契约类型中的XML属性,还是在这里使用wrappers的唯一选项?
发布于 2020-10-12 16:48:33
不幸的是,我发现实现这一目标的唯一方法是使用包装器类。
[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; }
}发布于 2014-07-28 22:06:21
尝试使用XmlElement(类型(数据))
https://stackoverflow.com/questions/24998525
复制相似问题