我必须实现一个服务来处理这个 SOAP 消息:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:serv="http://www.company.com/Service">
<soapenv:Body>
<serv:ServiceOperation xmlns="http://www.company.com/Service">
<serv:operationParam>X</serv:operationParam>
<serv:operationHeader>
<serv:headerParamA>12345</serv:headerParamA>
<serv:headerParamB>ABCD</serv:headerParamB>
...
消息合约目前看起来像:
[MessageContract(
WrapperName = nameof(ServiceOperation),
WrapperNamespace = ServiceNamespace,
IsWrapped = true)]
public class ServiceOperation
{
[MessageBodyMember(Name = "operationParam", Namespace = ServiceNamespace)]
public string OperationParam { get; set; }
[MessageBodyMember(Name = "operationHeader", Namespace = ServiceNamespace)]
public OperationHeader OperationHeader { get; set; }
...
operationParam
我的服务正确解析了字符串属性。但无论我做什么,我都无法让“复杂类型”operationHeader
工作。
OperationHeader
使用上面的代码,无论XmlType
和XmlElement
声明如何,其上的属性始终为空:
[XmlType]
public class OperationHeader
{
[XmlElement]
public string HeaderParamA { get; set; }
}
我已经尝试过OperationHeader
没有属性、MessageBodyMember
属性、将 XML 类型装饰为匿名的类的变体。类的所有成员仍然为空OperationHeader
。
非常奇怪的是,如果我这样做:
[MessageBodyMember(Name = "operationParam", Namespace = ServiceNamespace)]
public string OperationParam { get; set; }
[MessageBodyMember(Name = "operationHeader", Namespace = ServiceNamespace)]
public XmlElement OperationHeader { get; set; }
那么解析出来的XML元素就不是它operationHeader
本身了,而是来自XML的第一个子元素;headerParamA
.
有谁知道我的课程应该是什么样子?
我已经尝试完全按照这个答案来做,但这也只会为复杂类型的成员属性提供 null 。
或者我发送的 XML 是否以某种方式损坏?