在使用IDispatchOperationSelector访问服务之前更新Wcf消息时出错
本文关键字:Wcf 更新 消息 出错 IDispatchOperationSelector 访问 服务 | 更新日期: 2023-09-27 17:57:41
我们必须在SOAP消息到达WCF服务之前拦截它,以执行以下步骤:
- 将消息路由到正确的方法,因为客户端无法为我们提供SOAPAction值
- 由于客户端无法将命名空间信息添加到消息中,因此更新xml的命名空间
路由不是问题,但我们在创建消息时遇到了问题;一旦我们重新创建消息,正文只包含"…流…"。
在创建消息之前,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…"正文内容。
如果有人能帮忙,我会非常感激,因为我没有主意!
非常感谢
我认为你在混合行为责任。
IDispatchOperationSelector.SelectOperation
用于路由决策。它为您提供了对消息的引用,但其目的是允许访问消息属性。WCF不希望您使用此扩展点修改消息。我不能肯定地说,但问题可能就这么简单。
如果要更改消息命名空间,则应使用IDispatchMessageInspector。我建议为该任务创建第二个行为。这里有一个很好的消息检查器示例。