2

我必须实现一个服务来处理这个 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使用上面的代码,无论XmlTypeXmlElement声明如何,其上的属性始终为空:

[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 是否以某种方式损坏?

4

0 回答 0