c# - Lectura de la misma SslStream al mismo tiempo?
async-await tcpclient (2)
Implemente su propia clase TeeStream
derivada de Stream
que tiene un MemoryStream
que escribe cada vez que lee.
Actualmente estoy leyendo datos XML de un SslStream. La transmisión proviene de un objeto 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:
...
Además, me gustaría leer cada bit y byte del TcpClient directamente, independientemente de si se trata de datos XML o no. ¿Cómo puedo leer el mismo flujo dos veces? ¿Es posible leerlo con XmlReader y volcar el contenido de la transmisión de alguna manera?
Me gustaría ver qué viene de la transmisión y cómo se analiza a través de XmlReader para la depuración.
ACTUALIZAR:
Me gustaría mantener una secuencia ejecutándose en lugar de tener dos transmisiones independientes. Como ya tengo los datos, en mi aplicación no tiene sentido tenerlos de nuevo en la memoria.
Si una devolución de llamada para los datos que se acaban de leer está bien para usted, puede crear una Stream
contenedora que haga exactamente eso:
public class TeeStream : Stream
{
private readonly Stream m_underlyingStream;
private readonly Action<byte[], int> m_readCallback;
public TeeStream(Stream underlyingStream, Action<byte[], int> 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<int> 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
}
El uso sería algo como esto:
var teeStream = new TeeStream(sslStream, (bytes, read) => /* whatever */);
using (XmlReader reader = XmlReader.Create(
teeStream, new XmlReaderSettings { Async = true }))
…