WCF MessageHeader属性未反序列化

时间:2016-10-05 14:11:19

标签: c# .net wcf soap messagecontract

我正在开发WCF中基于SOAP的Web服务。

我的客户端使用以下SOAP请求xml:

将请求发送到WCF服务
<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/" e:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <e:Header>
        <me:RequestHead xmlns:me="http://www.my-namespace.org/header/abc" >
            <ID>0</ID>
            <Green>
                <a>101</a>
                <b>0</b>
            </Green>
            <Time>1</Tim>
        </me:RequestHead>
    </e:Header>
    <e:Body>
        <m:RequestBody xmlns:m="http://www.my-namespace.org/service/abc">
            <Time>
                <hh>23</hh>
                <mm>59</mm>
                <ss>59</ss>
            </Time>            
        </m:RequestBody>
    </e:Body>
</e:Envelope>

我创建了MessageContract类来将值传递给客户端或从客户端获取值。

MessageContract类中有多个MessageHeader属性属性,但是当请求发送到服务器时,具有MessageHeader属性的属性不是反序列化,它是始终 null

RequestHead标记中有前缀me,我认为它会产生将对XML请求反序列化为WCF服务对象的问题

但是在RequestBody标记中还有前缀m,但它已成功反序列化。

当我从me标记中删除前缀RequestHead时,它比成功运行。我得到了MessageHeader属性属性的值。

<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/" e:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <e:Header>
        <RequestHead xmlns="http://www.my-namespace.org/header/abc" >
            <ID>0</ID>
            <Green>
                <a>101</a>
                <b>0</b>
            </Green>
            <Time>1</Tim>
        </RequestHead>
    </e:Header>
    <e:Body>
        <m:RequestBody xmlns:m="http://www.my-namespace.org/service/abc">
            <hh>23</hh>
            <mm>59</mm>
            <ss>59</ss>
        </m:RequestBody>
    </e:Body>
</e:Envelope>

我的课程:

[MessageContract]
class Green
{
    [MessageHeader(Namespace = "")]
    public string a { get; set; }

    [MessageHeader(Namespace = "")]
    public string b { get; set; }
}

[MessageContract]
class RequestHead
{
    [MessageHeader(Namespace = "")]
    public int id { get; set; }

    [MessageHeader(Namespace = "")]
    public Green green { get; set; }

    [MessageHeader(Namespace = "")]
    public int Time { get; set; }
}

[MessageContract]
class Head
{
    [MessageHeader(Namespace = "http://www.my-namespace.org/header/abc")]
    public RequestHead RequestHead { get; set; }
}

[MessageContract(Namespace = "http://www.my-namespace.org/service/abc")]
class RequestBody : Head
{
    [MessageBodyMember(Order = 1)]
    public int hh { get; set; }

    [MessageBodyMember(Order = 1)]
    public int mm { get; set; }

    [MessageBodyMember(Order = 1)]
    public int ss { get; set; }
}

我在WCF服务中的操作方法如下所示:

public RequestBody CheckTime(RequestBody objBody)
{

}

当我使用以下代码检查请求SOAP XML时:

OperationContext.Current.RequestContext.RequestMessage.ToString();

它向我提供了带有标头值的SOAP XML的完整请求,但是没有将其反序列化为对象。

我不明白我哪里出错或者我错过了什么。

以下是同一个问题,但到目前为止还没有得到任何回答:How can I deserialize a custom SOAP header in WCF?

感谢您的帮助...

0 个答案:

没有答案