我必须实现一个服务来处理这个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
上的属性始终为null:
[XmlType]
public class OperationHeader
{
[XmlElement]
public string HeaderParamA { get; set; }
}
我尝试了OperationHeader
类的变体,没有属性,MessageBodyMember
属性,将XML类型伪装成匿名。 OperationHeader
类的所有成员仍为null。
非常奇怪的是,如果我这样做:
[MessageBodyMember(Name = "operationParam", Namespace = ServiceNamespace)]
public string OperationParam { get; set; }
[MessageBodyMember(Name = "operationHeader", Namespace = ServiceNamespace)]
public XmlElement OperationHeader { get; set; }
然后解析的XML元素不是operationHeader
本身,而是来自XML的第一个子元素; headerParamA
。
有谁知道我的课程应该是什么样的?
我尝试完全像在this answer中那样做,但是这也只为复杂类型的成员属性提供了null。
或者我发送的XML是以某种方式发送的?