声明TextFieldParser后Stream数据丢失的技术问题求助
解决TextFieldParser读取传入Stream时数据丢失的问题
这个问题我之前也碰到过,大概率是Stream的当前位置不在起始点导致的。当Stream从Controller传递到业务层时,可能已经被前面的操作(比如文件上传后的校验、预览)读取过一部分,Position指针直接移到了Stream的末尾,这时候TextFieldParser再去读取自然就找不到数据了。下面给你两种可行的解决方案:
方案1:重置Stream的Position到起始位置
如果你的Stream支持Seek操作(大部分本地文件流、MemoryStream都支持),直接在创建TextFieldParser前重置位置即可:
public CsvRecordReportModel processCsvStream(Stream dataStream, RecordSource recordSource, string fileName) { var report = new CsvRecordReportModel(); report.InsertedRecordCount = 0; report.FileName = fileName; // 关键步骤:重置Stream到起始位置 if(dataStream.CanSeek) { dataStream.Position = 0; } using (TextFieldParser csvParser = new TextFieldParser(dataStream)) { csvParser.CommentTokens = new string[] {"#"}; csvParser.SetDelimiters(new string[] {","}); csvParser.HasFieldsEnclosedInQuotes = true; // Skip the row with the column names csvParser.ReadLine(); while (!csvParser.EndOfData) { // 你的业务处理逻辑 } } return report; }
这里一定要先判断CanSeek属性,避免对不支持Seek的Stream(比如网络流)操作抛出异常。
方案2:处理不可Seek的Stream
如果你的Stream是不可Seek的(比如某些第三方流、网络流),可以先把Stream内容复制到MemoryStream里,再用这个可控的流来解析:
public CsvRecordReportModel processCsvStream(Stream dataStream, RecordSource recordSource, string fileName) { var report = new CsvRecordReportModel(); report.InsertedRecordCount = 0; report.FileName = fileName; // 复制原Stream到MemoryStream,确保可以从头读取 using(var memoryStream = new MemoryStream()) { dataStream.CopyTo(memoryStream); memoryStream.Position = 0; // 重置到起始位置 using (TextFieldParser csvParser = new TextFieldParser(memoryStream)) { csvParser.CommentTokens = new string[] {"#"}; csvParser.SetDelimiters(new string[] {","}); csvParser.HasFieldsEnclosedInQuotes = true; csvParser.ReadLine(); while (!csvParser.EndOfData) { // 你的业务处理逻辑 } } } return report; }
这种方法适用于所有类型的Stream,因为MemoryStream完全支持Seek和重复读取。
额外需要注意的点
- 确认Controller传递Stream时没有提前读取或关闭它,保证Stream在进入业务层方法时是可读且未被读取过的状态;
- 如果是ASP.NET Core上传文件的场景,
IFormFile的OpenReadStream()每次调用都会返回一个新的、Position在0的Stream,所以如果业务层接收的是这个方法返回的Stream,要避免在Controller里提前读取它。
内容的提问来源于stack exchange,提问作者joerdie
相关产品推荐
相关产品推荐

