0

我正在 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,我认为它在 WCF 服务处反序列化对对象的 XML 请求会产生问题

但在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,但不会将其反序列化为对象。

我不明白我哪里出错了,或者我遗漏了一些东西。

这是同样的问题,但到目前为止还没有得到任何回答:如何在 WCF 中反序列化自定义 SOAP 标头?

感谢帮助...

4

0 回答 0