在使用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访问服务之前更新Wcf消息时出错

我认为你在混合行为责任。

IDispatchOperationSelector.SelectOperation用于路由决策。它为您提供了对消息的引用,但其目的是允许访问消息属性。WCF不希望您使用此扩展点修改消息。我不能肯定地说,但问题可能就这么简单。

如果要更改消息命名空间,则应使用IDispatchMessageInspector。我建议为该任务创建第二个行为。这里有一个很好的消息检查器示例。