我们必须在它到达我们的WCF服务之前拦截SOAP消息,以执行以下步骤:
路由不是问题,但我们在创建消息时遇到问题;一旦我们重新创建消息,身体只包含" ...流..."。
在创建消息之前,messageContent变量包含有效的,正确的xml。
private Message UpdateNamespaces(Message message, string methodName)
{
var memoryStream = new MemoryStream();
var xmlWriter = XmlWriter.Create(memoryStream);
message.WriteMessage(xmlWriter);
xmlWriter.Flush();
var messageContent = Encoding.UTF8.GetString(memoryStream.ToArray());
xmlWriter.Close();
// Update messageContent with corrected XML
memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(messageContent));
var xmlDictionaryReader = XmlDictionaryReader.CreateTextReader(memoryStream, new XmlDictionaryReaderQuotas());
var newMessage = Message.CreateMessage(xmlDictionaryReader, int.MaxValue, message.Version);
newMessage.Properties.CopyProperties(message.Properties);
return newMessage;
}
在我们创建memoryStream的时候,messageContent是正确的,但是一旦我检查了newMessage.ToString()的内容,我就得到了" ... Stream ...... "身体内容。
如果有人可以提供帮助,我会非常感激,因为我没有想法!
非常感谢
答案 0 :(得分:0)
我认为你正在混合行为责任。
IDispatchOperationSelector.SelectOperation
用于路由决策。它为您提供了对消息的引用,但目的是启用对消息属性的访问。 WCF不希望您使用此扩展点修改消息。我不能肯定地说,但问题可能就是这么简单。
如果要更改消息名称空间,则应使用IDispatchMessageInspector。我建议为该任务创建第二个行为。这是一个不错的Message Inspector example。