替代StreamReader.ReadLine(filepath)以避免耗尽内存?

时间:2019-03-13 23:12:48

标签: c# out-of-memory streamreader denial-of-service

请考虑以下内容:

using (var fs = new StreamReader(filepath))
{
    while (!fs.EndOfStream)
    {
        string line = fs.ReadLine();
    }
}

如果filepath是一个包含很长字符行的文件(换行之间有很多字符),则可能导致服务器在ReadLine()调用之一上耗尽内存。这是潜在的拒绝服务媒介。

是否有任何C#类可以缓解此问题?我正在创建一个新类,该类继承StreamReader并使用StreamReader.ReadBlock()方法读取有限的字符块,但随后我必须处理换行符来解析该块,以便能够从文件中返回行。如果存在的话,我想使用一些Framework类来做同样的事情。

1 个答案:

答案 0 :(得分:0)

您可以读取街区,您只能跟踪自己的位置

            char[] buffer = new char[24];

            while (!r.EndOfStream)
            {
                bytesRead = r.ReadBlock(buffer, 0, buffer.Length);