我有来自客户端的以下SOAP请求。
<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/">
<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>
在上面的请求中有RequestHead
标记,我想在WCF反序列化请求之前将新的xmlns
属性添加到RequestHead
标记并转换为实际参数行动方法。
喜欢这样:
<e:Header>
<me:RequestHead xmlns:me="http://www.my-namespace.org/header/abc" xmlns="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>
因此我完成了以下工作。
首先,我实现了 IDispatchMessageFormatter 接口,因此我们可以在WCF将其反序列化为action方法的实际参数之前自定义SOAP信封。
public void DeserializeRequest(Message message, object[] parameters)
{
message = new RequestMessage(message);
this.objMessageFormatter.DeserializeRequest(message, parameters);
}
其次,我创建了我的自定义消息类,它扩展了Message
类,我在其中覆盖了OnWriteStartHeaders
方法,我试图将xmlns
属性添加到{ {1}}标记。
RequestHead
但是这并没有将protected override void OnWriteStartHeaders(XmlDictionaryWriter writer)
{
base.OnWriteStartHeaders(writer);
writer.WriteXmlnsAttribute("Header", "http://www.my-namespace.org/header/abc");
}
属性添加到xmlns
,而是将RequestHead
属性添加到xmlns
标记。
实际输出:
Header
需要输出:
<e:Header xmlns="http://www.my-namespace.org/header/abc">
<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>
问题;