ASP.NET Core Web API 流式返回,逐字显示-当前焦点
2023-04-23 22:19:36 来源:博客园 小 中
Websocket、SSE(Server-Sent Events)和长轮询(Long Polling)都是用于网页和服务端通信的技术。
Websocket是一种全双工通信协议,能够实现客户端和服务端之间的实时通信。它基于TCP协议,并且允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据。
(资料图)SSE是一种单向通信协议,允许服务器向客户端推送数据,但不支持客户端向服务器发送数据。SSE建立在HTTP协议上,通过在HTTP响应中使用特殊的Content-Type和事件流(event stream)格式来实现。
长轮询是一种技术,客户端向服务器发送一个请求,并且服务器保持连接打开直到有数据可以返回给客户端。如果在指定的时间内没有数据可用,则服务器会关闭连接,客户端需要重新建立连接并再次发起请求。
New Bing聊天页面是通过WebSocket进行通信。
Open AI的ChatGPT接口则是通过SSE协议由服务端推送数据
事实上,以上几种方式包括长轮询,都可以实现逐字显示的效果。那还有没有其他的办法可以实现这种效果了呢?
流式响应当客户端返回流的时候,客户端可以实时捕获到返回的信息,并不需要等全部Response结束了再处理。
下面就用ASP.NET Core Web API作为服务端实现流式响应。
返回文本内容服务端
[HttpPost("text")]public async Task Post(){ string filePath = "文档.txt"; Response.ContentType = "application/octet-stream"; var reader = new StreamReader(filePath); var buffer = new Memory(new char[5]); int writeLength = 0; //每次读取5个字符写入到流中 while ((writeLength = await reader.ReadBlockAsync(buffer)) > 0) { if (writeLength < buffer.Length) { buffer = buffer[..writeLength]; } await Response.WriteAsync(buffer.ToString()); await Task.Delay(100); }}
客户端
C# HttpClientpublic async void GetText(){ var url = "http://localhost:5000/config/text"; var client = new HttpClient(); using HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, url); var response = await client.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead); await using var stream = await response.Content.ReadAsStreamAsync(); var bytes = new byte[20]; int writeLength = 0; while ((writeLength = stream.Read(bytes, 0, bytes.Length)) > 0) { Console.Write(Encoding.UTF8.GetString(bytes, 0, writeLength)); } Console.WriteLine(); Console.WriteLine("END");}
HttpCompletionOption
枚举有两个值,默认情况下使用的是ResponseContentRead
ResponseContentRead
:等到整个响应完成才完成操作
ResponseHeadersRead
:一旦获取到响应头即完成操作,不用等到整个内容响应
<script> var div = document.getElementById("content") var url = "http://localhost:5000/config/text" var client = new XMLHttpRequest() client.open("POST", url) client.onprogress = function (progressEvent) { div.innerText = progressEvent.target.responseText } client.onloadend = function (progressEvent) { div.append("END") } client.send()</script>
用axios请求就是监听onDownloadProgress
了。
返回图片浏览器是通过
Response Header
中的Content-Type
来解析服务端响应体的。如果后端接口没有设置Response.ContentType = "application/octet-stream"
,onprogress
只会在响应全部完成后触发。
服务端
[HttpGet("img")]public async Task Stream(){ string filePath = "pixelcity.png"; new FileExtensionContentTypeProvider().TryGetContentType(filePath, out string contentType); Response.ContentType = contentType ?? "application/octet-stream"; var fileStream = System.IO.File.OpenRead(filePath); var bytes = new byte[1024]; int writeLength = 0; while ((writeLength = fileStream.Read(bytes, 0, bytes.Length)) > 0) { await Response.Body.WriteAsync(bytes, 0, writeLength); await Task.Delay(100); }}
关键词:
相关文章
- ASP.NET Core Web API 流式返回,逐字显示-当前焦点
- 基于Canal实现MySQL 8.0 数据库数据同步-当前快讯
- 即时看!Node工程的依赖包管理方式
- 中南建设为子公司文昌中南、芜湖荣众合计担保7952万元 天天速看
- 广东统计局:一季度广东实现地区生产总值突破3万亿,工业生产增速转正|世界快报
- 全球微头条丨我国已有20个省份、40余条线路开展车路协同智慧高速公路建设
- 生态环境部:今年一季度全国地表水水质提升
- 第九章 无眠之夜
- 【速看料】东吴证券给予信德新材买入评级 2022年年报及2023年一季报点评:Q1单位盈利承压 业绩略低于市场预期
- 新华三与UNICON.UZ签署战略合作协议 焦点短讯
- 2022年年报&23年一季报交流记录
- 每日讯息!“中特估”的重大投资方向!
- 简讯:总算也反超了
- 短线自选池(2)4.24—4.28-环球观察
- 网传女基金经理豪购翠湖1.7亿元豪宅! 李蓓澄清:现在买翠湖跟2000块以上买贵州茅台没什么区别
- 伊朗官员:有关部门将尽一切努力在伊朗和沙特之间开设航班 全球热资讯
- 办实事 暖人心——中信银行晚报大厦支行为特殊客户开启绿色通道服务_全球微动态
- 曝!宝马说谎了!两女孩没有辞职,只是戴了个口罩又出来了
- 环球快报:春光乍现!宾利女销售不穿内裤,下蹲时全走光,网友:真没节操?
- 嫌中国麻将不好看,美国人设计“白人麻将”,满满的美国文化|微动态
- 央行召开2023年会计财务工作电视会议-快播报
- 敏感肌肤护肤品排行榜_敏感肌肤_环球观察
- 惠伦晶体4月24日起停牌 控股股东拟变更为国企_天天关注
- 快看:人民海军开展多项主题活动纪念成立74周年
- 当前时讯:过去一年,你读了几本书?——第20次全国国民阅读调查结果发布
- 新华三与UNICON.UZ签署战略合作协议 看点
- 博彦科技:接受东方证券等机构调研-环球最新
- 俄罗斯与联合国将磋商黑海港口农产品外运协议前景
- 最新消息:多家A股上市公司谋划布局6G
- 宋育仁的主要活动_宋育仁简介 天天快播
热文推荐
排行推荐

广东统计局:一季度广东实现地区生产总值突破3万亿,工业生产增速转正|世界快报

全球微头条丨我国已有20个省份、40余条线路开展车路协同智慧高速公路建设

生态环境部:今年一季度全国地表水水质提升
