当您不知道长度时,如何使用 ReadAsync 方法获取从 sslsteam 接收的字节长度?

How to get length of bytes received from sslsteam using ReadAsync method when you don't know the length?

我正在使用下面的异步方法从服务器获取响应。根据请求类型,我从服务器获得的响应从 1200 字节到 1500 字节不等。所以,我无法修复缓冲区的大小。

有什么办法可以从SslStream.ReadAsync得到接收到的原始字节的长度吗?

byte[] Buffer = new byte[1500];
await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);

我尝试使用以下代码,但出现异常:

This stream don't support seek operations.

await _sslStream.ReadAsync(Buffer, 0, (int)_sslStream.Length);

之前,我使用了BeginRead / EndRead。这样我就得到了缓冲区的原始大小,但 Async await 看起来更干净了。所以,我想检查是否可以使用 ReadAsync.

来获取长度

异常说的很清楚:

This stream don't support seek operations.

首先,我不明白为什么你不能使用更大的缓冲区:

byte[] Buffer = new byte[1500];    
await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);

如果流中的数据少于缓冲区可以容纳的数据,则只会加载缓冲区的一部分。也许你不知道,但是你可以得到read bytes的值:

byte[] Buffer = new byte[1500];    
var bytesRead = await _sslStream.ReadAsync(Buffer, 0, Buffer.Length);

然后您可以创建自己的缓冲区,正好适合读取数据的长度:

byte[] bufferThatFitsData = new byte[bytesRead];
Array.Copy(buffer, 0, bufferThatFitsData, 0, bytesRead);

现在,bufferThatFitsData 的长度等于流的大小(假设不超过 1500 字节)。