从wcf流式Web服务获取基础流

时间:2011-03-09 09:20:56

标签: wcf web-services streaming

我正在WCF中构建流式Web服务,并且在访问底层流时遇到问题。

我正在实施基于wsdl的现有合同,但我想使服务流式传输。由于我无法更改合同,因此我无法将Stream用作参数选项(因为这会更改合同)。

所以我决定使用Message作为参数并返回。这完美无缺。

但我想访问Stream对象(必须在Message对象或其属性中的某个位置)。但是Message给我的唯一的东西是XmlDictionaryReader,这不允许访问Stream。

public Message GetMessage(Message message)
    {
        // We need some way to access the underlying stream from the message - the GetReaderAtBodyContents is not usable
        XmlDictionaryReader reader = message.GetReaderAtBodyContents();
        CopyReaderToFile(reader);
        return Message.CreateMessage(MessageVersion.Soap11, "http://tempuri.org/IStreamingService/GetMessageResponse", "Hej med dig fra GetMessage. MessageLength ");
    }

以上显示了我的服务实现。 XmlDictionaryReader的主要问题是它不允许我访问客户端发送的精确数据 - 换句话说,我无法从服务上的客户端重现内容。这很糟糕,因为我无法验证MessageHeaders中存在的签名。

那么有没有办法访问底层流?这可以通过行为来实现吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

问题在于消息本身不提供流式传输,而是通过底层消息编码器提供。正如您在两个抽象MessageEncoder类的方法中看到的那样:

该流仅在通道级别而非消息中可用。另一个问题是流式传输不能与消息安全性结合 - 因此您不能使用任何内置签名等。