HttpClient 使用(二)流式请求

原文地址:https://www.cnblogs.com/ysmc/p/18780674

  近年AI风靡全球,我们日常见到的最多的就是跟AI聊天,极大减少了我们的搜索时间,不过大家也要注意甄别AI回答的正确性,身体不舒服还是老老实实看医生。

  AI聊天的输出是逐字输出的,有些小伙伴就很好奇这个是怎么实现的,比较简单的就是SSE,高级点的是WebSocket,本文我们先讲一下SSE。

SSE

Server-Sent Events,基于 HTTP 协议的推送技术,服务器可以向目标持续推送数据,与 WebSocket 不同,它是单向的。

秉承一向的惯例,直接上代码

服务端

这里读取一个本地文件,每100ms往客户端发送5个字符,需要注意的一点是,返回的 ContentType = “application/octet-stream”,你需要告诉客户端返回的是一个流

 1 [HttpGet("GetStream")]
 2 public async Task GetStream()
 3 {
 4     string filePath = "文档.txt";
 5     Response.ContentType = "application/octet-stream";
 6     var reader = new StreamReader(filePath);
 7     var buffer = new Memory<char>(new char[5]);
 8     int writeLength;
 9     //每次读取5个字符写入到流中
10     while ((writeLength = await reader.ReadBlockAsync(buffer)) > 0)
11     {
12         if (writeLength < buffer.Length)
13         {
14             buffer = buffer[..writeLength];
15         }
16         var value = buffer.ToString();
17         await Response.WriteAsync(value);
18         await Task.Delay(100);
19     }
20 }

读取的文档内容

 客户端

 1 [HttpGet("TestGetStream")]
 2 public async Task TestGetStream([FromServices] IHttpClientFactory httpClientFactory)
 3 {
 4     using var client = httpClientFactory.CreateClient();
 5     using var stream = await client.GetStreamAsync("http://localhost:5237/api/Test/GetStream");
 6     using var streamReader = new StreamReader(stream);
 7     var buffer = new char[5];
 8     int writeLength;
 9     while ((writeLength = await streamReader.ReadBlockAsync(buffer, 0, buffer.Length)) > 0)
10     {
11         Console.Write(new string(buffer, 0, writeLength));
12     }
13     Console.WriteLine("\nEND");
14 }

 效果

  这里我们使用控制台简单展示一下

 

来源链接:https://www.cnblogs.com/ysmc/p/18780674

© 版权声明
THE END
支持一下吧
点赞13 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容