我正在 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 标头?
感谢帮助...