使用 IClientMessageInspector 重写 WCF 消息
本文关键字:消息 WCF 重写 IClientMessageInspector 使用 | 更新日期: 2023-09-27 18:33:07
>我正在调用供应商 Web 服务,其调用的架构需要在 body 标记中使用自定义命名空间,如下所示:
<s:Body xmlns:ddw="http://www.infinity.com/bpm/model/OmniLinkServices/DDWEBCallInput"
xmlns:omn="http://eclipse.org/stardust/models/generated/OmniLinkServices">
我无法通过属性配置、绑定配置等找到添加此命名空间的好方法,因此我创建了一个 IClientMessageInspector 的实现来将命名空间添加到 body 标签中。 它有效,但随后消息的正文变为:
<s:Body xmlns:ddw="http://www.infinity.com/bpm/model/OmniLinkServices/DDWEBCallInput"
xmlns:omn="http://eclipse.org/stardust/models/generated/OmniLinkServices">
... stream ...
</s:Body>
注意奇怪的...流。。。正文的内容。
这是我对BeforeSendRequest
IClientMessageInspector
的实现
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
//Copy old message into XPathNavigator so as first step in transforming it to (newer) XDocument for modification
Message newMessage = null;
MessageBuffer msgbuf = request.CreateBufferedCopy(int.MaxValue);
XPathNavigator nav = msgbuf.CreateNavigator();
//load the old message into message stream via XmlWriter
MemoryStream ms = new MemoryStream();
XmlWriter xw = XmlWriter.Create(ms);
nav.WriteSubtree(xw);
xw.Flush();
xw.Close();
ms.Position = 0;
//load the XDocument from the XmlREader
XDocument xDoc = XDocument.Load(XmlReader.Create(ms));
ms.Close();
//add the sungard namespaces to the body of the message
var body = (from x in xDoc.Descendants() where x.Name.LocalName == "Body" select x).First();
var ddwns = new XAttribute(XNamespace.Xmlns + "ddw", "http://www.infinity.com/bpm/model/OmniLinkServices/DDWEBCallInput");
var omnns = new XAttribute(XNamespace.Xmlns + "omn", "http://eclipse.org/stardust/models/generated/OmniLinkServices");
body.Add(ddwns);
body.Add(omnns);
//create the new message
//write the XDoc back out to memory stream
MemoryStream newMsg = new MemoryStream();
xw = XmlWriter.Create(newMsg);
xDoc.Save(xw);
xw.Flush();
xw.Close();
newMsg.Position = 0;
//create the new message
XmlReader reader = XmlReader.Create(newMsg);
newMessage = Message.CreateMessage(reader, int.MaxValue, request.Version);
request = newMessage;
return null;
}
在函数的最后,XDocument
仍然具有有效的XML,但是当我在最后创建消息时,这似乎是问题发生的地方。
有人有什么想法吗?
似乎这只是 WCF 记录消息的方式。 看着提琴手,整个xml正在经历。 我不明白为什么 WCF 会以这种方式记录,但无论如何。
仅供参考,对于遇到这种情况的任何其他人。