从wcf流式Web服务获取底层流
我正在WCF中构建流式Web服务,在访问底层流时遇到问题 我正在实现一个基于wsdl的现有契约,但我想让服务流化。因为我不能更改合同,所以我不能将流用作参数选项(因为这会更改合同) 因此,我决定使用消息作为参数并返回。这是完美的 但我希望能够访问流对象(它必须位于消息对象或其属性的某个位置)。但是消息给我的唯一东西是XmlDictionaryReader,这不允许访问流从wcf流式Web服务获取底层流,wcf,web-services,streaming,Wcf,Web Services,Streaming,我正在WCF中构建流式Web服务,在访问底层流时遇到问题 我正在实现一个基于wsdl的现有契约,但我想让服务流化。因为我不能更改合同,所以我不能将流用作参数选项(因为这会更改合同) 因此,我决定使用消息作为参数并返回。这是完美的 但我希望能够访问流对象(它必须位于消息对象或其属性的某个位置)。但是消息给我的唯一东西是XmlDictionaryReader,这不允许访问流 public Message GetMessage(Message message) { // We
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中存在的签名
那么有没有一种方法可以访问底层流呢?这可以通过行为来实现吗
提前感谢问题在于流式传输不是由消息本身提供的,而是由消息编码器提供的。正如您在抽象MessageEncoder类的两个方法中所看到的:
该流仅在通道级别上可用,不在消息中可用。另一个问题是流式传输不能与消息安全性相结合,因此不能使用任何内置签名等。问题在于流式传输不是由消息本身提供的,而是由消息编码器提供的。正如您在抽象MessageEncoder类的两个方法中所看到的: