如何消除调用OpenAI流式API转发响应后出现的‘server closed abruptly (missing close_notify)’提示
如何消除调用OpenAI流式API转发响应后出现的‘server closed abruptly (missing close_notify)’提示
我之前也碰到过这个烦人的问题——明明流式内容已经正常返回了,但每次用curl调用自己的ASP.NET Core转发接口时,都会弹出“server closed abruptly (missing close_notify)”的错误提示,折腾了好一会儿才找到根源。
先说说你的场景:你通过ASP.NET Core写了一个转发接口,手动调用OpenAI的流式聊天补全API,用SendAsync获取响应后逐行读取,再把内容输出给客户端。虽然流式响应能正常工作,但这个错误提示一直挥之不去。
问题根源
其实问题出在处理OpenAI流式返回数据的方式不够健壮。OpenAI的流式返回中,并不是每一条data:开头的行都会携带content属性——比如有些行可能只返回角色信息,或者其他元数据。你原来的代码直接用GetProperty("content")硬取这个属性,一旦遇到没有content的行,就会抛出JsonException,导致你的StreamReader循环提前终止,连接没有被优雅关闭,curl检测到连接意外中断,就会弹出这个提示。
解决方案
把原来解析delta的代码改成安全的属性检查方式,避免因为找不到属性而抛出异常:
var choice = json.RootElement.GetProperty("choices")[0]; if (choice.TryGetProperty("delta", out var deltaElement) && deltaElement.TryGetProperty("content", out var contentElement)) { var delta = contentElement.GetString(); if (!string.IsNullOrEmpty(delta)) { var buffer = Encoding.UTF8.GetBytes(delta); await Response.Body.WriteAsync(buffer, 0, buffer.Length); await Response.Body.FlushAsync(); } }
额外小提示
另外,处理完[DONE]标记后,确保循环能正常结束,让连接优雅关闭。ASP.NET Core通常会帮你处理Response.Body的关闭和flush,但如果有需要,也可以在循环结束后手动调用一次await Response.Body.FlushAsync(),确保所有数据都发送给了客户端。
内容来源于stack exchange
相关产品推荐
相关产品推荐

