我正在try 在.NET7.0中创建一个WebAPI端点,它将从OpenAI API获取流文本数据,并将这些数据逐个块地返回给用户.

这是我的控制器:

[HttpGet]
public async IAsyncEnumerable<string> StreamAnswer(string message)
{
    // await foreach (var part in _openAiManager.StreamAnswer(message))
    // {
    //     yield return part;
    // }
    yield return "test";
    Thread.Sleep(3000);
    yield return "test2";
    Thread.Sleep(3000);
    yield return "test3";
    Thread.Sleep(3000);
    yield return "test4";
    Thread.Sleep(3000);
    yield return "test5";
    Thread.Sleep(3000);
}

以下是我try 在Web浏览器中接收数据的方式:

const response = await fetch('http://localhost:5159/OpenAi?message=test');
const reader = response.body.getReader();

while (true) {
  const {value, done} = await reader.read();
  if (done) break;
  console.log('Received', value);
}

console.log('Response fully received');

由于某些原因,我总是在控制器的操作中完成所有代码的执行后,将所有数据作为一个大块来获取.取而代之的是,我希望一到达就收到大块数据.

我错过了什么吗?

推荐答案

您阻塞了服务器线程.相反,await Task.Delay(3000);

艾格

async IAsyncEnumerable<string> StreamAnswer(string message)
{
    // await foreach (var part in _openAiManager.StreamAnswer(message))
    // {
    //     yield return part;
    // }
    yield return "test";
    await Task.Delay(3000);
    yield return "test2";
    await Task.Delay(3000);
    yield return "test3";
    await Task.Delay(3000);
    yield return "test4";
    await Task.Delay(3000);
    yield return "test5";
    
}

然后,从PowerShell运行wget将显示结果的增量加载.

enter image description here

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

JavaScript .Click()函数不起作用

Angular:ng-contract未显示

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

提交表格后保留Web表格中的收件箱值?

通过嵌套模型对象进行Mongoose搜索

Next.js(react)使用moment或不使用日期和时间格式

WebRTC关闭navigator. getUserMedia正确

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

无法从NextJS组件传递函数作为参数'

我怎么才能得到Kotlin的密文?

检索相加到点的子项

环境值在.js文件/Next.js中不起作用

为什么可选参数的顺序会导致问题?

令牌JWT未过期

JavaScript将字符串数字转换为整数

如何使用puppeteer操作所有选项

通过解构/功能组件接收props-prop验证中缺少错误"

如何使用fltter_js将对象作为参数传递给javascrip?

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?