调用PostAsJsonAsync返回500错误,后端Post方法问题排查求助
问题描述
前端调用代码:
var response = await Http.PostAsJsonAsync<List<CreateBookingPoLinesViewModel>>("api/downloadCsv", CreateBookingPoLinesViewModel);
后端Post方法实现:
[HttpPost] public async Task<FileStreamResult> Post([FromBody] List<CreateBookingPoLinesViewModel> value) { try { MemoryStream ms = new MemoryStream(); var writer = new StreamWriter(ms); var csv = new CsvWriter(writer, CultureInfo.InvariantCulture); foreach (var line in value.Select(x => x.pOLineDTO)) { csv.WriteRecord(line); csv.Flush(); } FileStreamResult result = new FileStreamResult(ms, "text/csv") { FileDownloadName = string.Format("PoLines-{0}.csv", value.First().pOLineDTO.PurchaseOrderId) }; return result; } catch (Exception ex) { throw; } }
调用方与后端均已添加try/catch块,但均未捕获到异常。后端代码已执行至return result行,且完成foreach循环的记录写入,但返回的response显示500内部服务器错误,请问该Post方法存在什么问题?
问题分析与修复方案
这个500错误的核心问题出在流的处理逻辑上,具体有两点:
- MemoryStream读取位置未重置
写入CSV内容后,MemoryStream的当前指针停留在流的末尾。当ASP.NET Core框架尝试通过FileStreamResult读取这个流返回给前端时,会因为没有可读取的内容而抛出异常。但这个异常发生在方法返回后的管道处理阶段,所以你的try/catch块无法捕获到。
修复:在创建FileStreamResult前,将流的位置重置到起始处:
ms.Position = 0;
- StreamWriter缓存未完全写入
仅调用csv.Flush()只能确保CsvWriter的缓存写入到StreamWriter,但StreamWriter自身也有缓存,部分内容可能还未写入到底层的MemoryStream中。
修复:在重置流位置前,先调用StreamWriter的Flush方法:
writer.Flush(); // 确保StreamWriter的缓存全部写入MemoryStream ms.Position = 0;
另外还有两个潜在风险需要注意:
- 若
value为空列表,value.First()会抛出InvalidOperationException,建议先判断列表是否为空再执行后续逻辑。 - 当前catch块仅重新抛出异常,没有日志记录,不利于排查问题,建议在catch中添加日志输出。
内容的提问来源于stack exchange,提问作者bilpor
相关产品推荐
相关产品推荐

