我正在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中存在的签名。
那么有没有办法访问底层流?这可以通过行为来实现吗?
提前致谢
答案 0 :(得分:1)
问题在于消息本身不提供流式传输,而是通过底层消息编码器提供。正如您在两个抽象MessageEncoder类的方法中看到的那样:
该流仅在通道级别而非消息中可用。另一个问题是流式传输不能与消息安全性结合 - 因此您不能使用任何内置签名等。