使用IDispatchOperationSelector访问服务之前更新Wcf消息时出错

时间:2014-04-10 11:44:23

标签: c# xml wcf

我们必须在它到达我们的WCF服务之前拦截SOAP消息,以执行以下步骤:

  • 将邮件路由到正确的方法,因为客户端无法向我们提供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 ...... "身体内容。

如果有人可以提供帮助,我会非常感激,因为我没有想法!

非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

如果要更改消息名称空间,则应使用IDispatchMessageInspector。我建议为该任务创建第二个行为。这是一个不错的Message Inspector example