我需要替换流式 http 响应中的字符串。这样做的天真的方法是
using var reader = new StreamReader(input, leaveOpen: true);
var original = await reader.ReadToEndAsync();
var replaced = original.Replace(old, new, StringComparison.InvariantCultureIgnoreCase);
await output.WriteAsync(Encoding.UTF8.GetBytes(replaced));
这是非常消耗资源和内存的,因为在替换字符串之前必须将完整的响应读入内存。
我一直在看
System.IO.Pipelines
和PipeReader
。虽然这确实使我能够有效地访问流,但它适用于 byte
,这使得在 Utf-8 中工作时转换为 char 出现问题。
我见过的一种方法是在流读取器上使用
ReadLineAsync
,但我不知道流是否包含任何换行符。
我见过的另一种方法是使用队列,但即使这样也显得笨拙。
所以我的问题是:在不读取内存中的完整流的情况下替换流文本的最佳方法是什么?
我的想法:
old[0]
old
数组中的以下字节。
old
序列,则先输出old[0]
位置之前的字节,然后输出new
数组中的字节。返回步骤 3。old[0]
位置之前的字节,然后将剩余字节移至缓冲区开头。转到步骤 2。