gpt4 book ai didi

c# - StreamReader 缓冲带有 GZIP 的流式 HTTP?

转载 作者:太空狗 更新时间:2023-10-30 00:53:54 24 4
gpt4 key购买 nike

努力寻找任何遇到类似问题或类似问题的人。

我目前正在使用具有 GZip 要求的 http (json) 流,并且从发送数据到 reader.ReadLine() 读取数据,我遇到了延迟.有人向我建议,这可能与将数据保留在缓冲区中的解码有关?

这是我目前拥有的,除了延迟之外它工作正常。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);
request.Method = "GET";

request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(username, password);

request.AutomaticDecompression = DecompressionMethods.GZip;
request.ContentType = "application/json";
request.Accept = "application/json";
request.Timeout = 30;
request.BeginGetResponse(AsyncCallback, request);

然后在 AsyncCallback 方法中我有:

HttpWebRequest request = result.AsyncState as HttpWebRequest;

using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result))
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{

while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (string.IsNullOrWhiteSpace(line)) continue;

Console.WriteLine(line);
}
}

它只是停留在 reader.Readline() 上,直到收到更多数据,然后甚至阻止其中的一些数据。还收到了保持事件的换行符,当它确实决定读取某些内容时,这些通常会立即全部读出。

我已经测试了与运行 curl 命令并排运行的流,curl 命令完美地接收和解压缩数据。

任何见解都会很棒。谢谢,

编辑在 streamreader 上使用缓冲区大小没有运气。

new StreamReader(stream, Encoding.UTF8, true, 1)

编辑也没有运气更新到 .NET 4.5 并使用

request.AllowReadStreamBuffering = false;

最佳答案

更新:这似乎在很长一段时间内都存在较高音量的问题,并且应该只用于缓冲区影响应用程序功能的小音量。我已经切换回 StreamReader

这就是我最终想到的。这有效,没有延迟。这不会被自动 GZip 解压缩缓冲。

using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result))
using (Stream stream = response.GetResponseStream())
using (MemoryStream memory = new MemoryStream())
using (GZipStream gzip = new GZipStream(memory, CompressionMode.Decompress))
{
byte[] compressedBuffer = new byte[8192];
byte[] uncompressedBuffer = new byte[8192];
List<byte> output = new List<byte>();

while (stream.CanRead)
{
int readCount = stream.Read(compressedBuffer, 0, compressedBuffer.Length);

memory.Write(compressedBuffer.Take(readCount).ToArray(), 0, readCount);
memory.Position = 0;

int uncompressedLength = gzip.Read(uncompressedBuffer, 0, uncompressedBuffer.Length);

output.AddRange(uncompressedBuffer.Take(uncompressedLength));

if (!output.Contains(0x0A)) continue;

byte[] bytesToDecode = output.Take(output.LastIndexOf(0x0A) + 1).ToArray();
string outputString = Encoding.UTF8.GetString(bytesToDecode);
output.RemoveRange(0, bytesToDecode.Length);

string[] lines = outputString.Split(new[] { Environment.NewLine }, new StringSplitOptions());
for (int i = 0; i < (lines.Length - 1); i++)
{
Console.WriteLine(lines[i]);
}

memory.SetLength(0);
}
}

关于c# - StreamReader 缓冲带有 GZIP 的流式 HTTP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com