我正在开发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?
感谢您的帮助...