0

現在、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:
...

さらに、XML データであるかどうかに関係なく、TcpClient からすべてのビットとバイトを直接読み取りたいと考えています。同じストリームを 2 回読み取るにはどうすればよいですか? XmlReader でそれを読み取り、ストリーム コンテンツを何らかの方法でダンプすることは可能ですか?

ストリームの内容と、デバッグのために XmlReader を介してどのように解析されるかを確認したいと思います。

アップデート:

2 つの独立したストリームを使用するのではなく、1 つのストリームを実行し続けたいと考えています。私はすでにデータを持っているので、アプリケーションでそれをメモリに再び持つことは意味がありません。

4

2 に答える 2

1

Stream読み取ったばかりのデータのコールバックが問題ない場合は、まさにそれを行うラッパーを作成できます。

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
}

使用法は次のようになります。

var teeStream = new TeeStream(sslStream, (bytes, read) => /* whatever */);

using (XmlReader reader = XmlReader.Create(
    teeStream, new XmlReaderSettings { Async = true }))
…
于 2013-08-21T00:29:31.070 に答える