同时从同一个SslStream中读取?

我目前正在从SslStream中读取XML数据。 该流来自TcpClient对象。

using (XmlReader r = XmlReader.Create(sslStream, new XmlReaderSettings() { Async = true })) { while (await r.ReadAsync()) { ResetStream = false; switch (r.NodeType) { case XmlNodeType.XmlDeclaration: ... break; case XmlNodeType.Element: ... 

另外,我想直接从TcpClient读取每个位和字节,无论它是否是XML数据。 如何两次读取相同的流? 是否可以使用XmlReader读取它以某种方式转储流内容?

我想看看来自流的内容以及如何通过XmlReader解析它以进行调试。

更新:

我想保持一个流运行,而不是有两个独立的流。 由于我已经拥有了数据,因此在我的应用程序中将它再次存储在内存中是没有意义的。

如果刚才读取的数据的回调对你来说没问题,你可以创建一个包装Stream来完成:

 public class TeeStream : Stream { private readonly Stream m_underlyingStream; private readonly Action m_readCallback; public TeeStream(Stream underlyingStream, Action readCallback) { m_underlyingStream = underlyingStream; m_readCallback = readCallback; } public override int Read(byte[] buffer, int offset, int count) { var read = m_underlyingStream.Read(buffer, offset, count); m_readCallback(buffer, read); return read; } public override async Task ReadAsync( byte[] buffer, int offset, int count, CancellationToken cancellationToken) { var read = await m_underlyingStream.ReadAsync( buffer, offset, count, cancellationToken); m_readCallback(buffer, read); return read; } // the remaining members that have to be overridden // just call the same member of underlyingStream } 

用法是这样的:

 var teeStream = new TeeStream(sslStream, (bytes, read) => /* whatever */); using (XmlReader reader = XmlReader.Create( teeStream, new XmlReaderSettings { Async = true })) … 

实现自己从Stream派生的TeeStream类,它每次执行读取时都会写入一个MemoryStream