WCF MessageContract复杂类型属性未反序列化

时间:2016-10-24 20:39:25

标签: xml wcf soap messagecontract

我必须实现一个服务来处理这个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起作用。

使用上面的代码,无论OperationHeaderXmlType声明如何,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是以某种方式发送的?

0 个答案:

没有答案