基于HTTP API流式传输JSON数据时的错误上报问题
.NET 7+ 流式 IAsyncEnumerable MVC 端点的异常处理最佳实践
场景背景
我有一个返回IAsyncEnumerable<int>的MVC端点,从数据库表中通过游标流式读取数据行(数据库驱动支持IAsyncEnumerable游标查询),代码示例如下:
[HttpGet] public async IAsyncEnumerable<int> SomeEndpoint() { await foreach (var row in PerformSelectQuery()) yield return int.Parse(row[0]); }
目前.NET与System.Text.Json的默认处理完全正常:响应会自动设置Transfer-Encoding: chunked,数据库返回第一行数据时就开始写入响应,无需缓冲内存,客户端也能更快解析结果(如果支持流式解析的话)。
当前遇到的问题
当数据行中某列存在null值时(比如90000行中的第24645行),int.Parse会抛出异常,此时.NET会直接断开连接,客户端(比如Postman)只能知道请求被中止,无法获取具体的错误信息。
如果在foreach中捕获异常并执行yield break,请求会静默终止,客户端依然不知道返回结果不完整,也无法得知错误原因。
已尝试的方案
- Result/Option monad包装返回值:将每个返回值用Result/Option类型包装后序列化到流中,捕获错误后可以选择中止或继续返回后续数据,但这种方式面临多态序列化的实现难点。
- HTTP Trailer头:了解到Trailer可以在响应末尾附加元数据,但它存在诸多问题:客户端支持度低、使用复杂、控制器中设置方式不明确、没有标准化的错误上报格式,且无法修改HTTP状态码;更关键的是.NET不支持HTTP/1.1的Trailer,因此无法使用。
寻求建议
我在提问前已做过大量搜索,目前未找到明确的解决方案,Stack Overflow上也有其他人提出相同疑问但未获回复。现寻求.NET 7+环境下该场景的最佳实践,以及类似问题的处理经验,同时欢迎任何相关的技术建议。
内容的提问来源于stack exchange,提问作者Ar Es
相关产品推荐
相关产品推荐

