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# HttpClient
public 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:一旦获取到响应头即完成操作,不用等到整个内容响应

js XMLHttpRequest
<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 流式返回,逐字显示-当前焦点
ASP.NET Core Web API 流式返回,逐字显示-当前焦点

Websocket、SSE(Server-SentEvents)和长轮询(LongP......更多>

基于Canal实现MySQL 8.0 数据库数据同步-当前快讯
基于Canal实现MySQL 8.0 数据库数据同步-当前快讯

前言服务器说明|主机名称|操作系统|说明||--|--|||192......更多>

即时看!Node工程的依赖包管理方式
即时看!Node工程的依赖包管理方式

在前端工程化中,JavaScript依赖包管理是非常重要的一......更多>

中南建设为子公司文昌中南、芜湖荣众合计担保7952万元 天天速看
中南建设为子公司文昌中南、芜湖荣众合计担保7952万元 天天速看

截至公告日,中南建设及控股子公司对外担保余额为427......更多>

排行推荐

广东统计局:一季度广东实现地区生产总值突破3万亿,工业生产增速转正|世界快报
广东统计局:一季度广东实现地区生产总值突破3万亿,工业生产增速转正|世界快报
上证报中国证券网讯4月23日,广东统计局发布2023年一... 更多>
全球微头条丨我国已有20个省份、40余条线路开展车路协同智慧高速公路建设
全球微头条丨我国已有20个省份、40余条线路开展车路协同智慧高速公路建设
新华社北京4月23日电(记者叶昊鸣)智慧高速公路是交... 更多>
生态环境部:今年一季度全国地表水水质提升
生态环境部:今年一季度全国地表水水质提升
上证报中国证券网讯据生态环境部4月23日消息,生态环... 更多>
第九章 无眠之夜
第九章 无眠之夜
【在这个被堕渊的侵蚀的世界,死亡,变得不再是一切的... 更多>
看热讯:雅诗阁提前实现全球16万套的管理目标
一季度,雅诗阁新签超4000套单元,提前实现全球管理16... 更多>
热资讯!国资委召开国有企业创建世界一流示范企业推进会
据国资委网站,国资委副主任翁杰明指出,示范企业下一... 更多>
海关总署副署长王令浚会见克罗地亚外交部国务秘书马图斯奇 当前焦点
据海关发布微信公众号,海关总署副署长王令浚21日上午... 更多>
证监会核发首批企业债券注册批文 短讯
据证监会官网,证监会对国家发展改革委移交的34个企业... 更多>
宁静的快乐 每日快报
前几天和朋友去看盆景。朋友随口说了一句,这么小的一... 更多>
香港特首李家超访问比亚迪深圳总部|头条焦点
4月22日,香港特首李家超参观了比亚迪深圳总部,乘坐... 更多>
热消息:当AI已成往事,系统会自动再平衡:(第1023篇周策略)2023.04.23
$银华天玑-悄悄盈(TIA05031)$$银华天玑-年年红(TIAA04... 更多>
人工智能和Ai产业链是一场财富的再分配
1:创业板左侧第一个蓝色圈处是2022年4 22-4 30号,... 更多>
财报季最后一周!海天味业、迈瑞医疗、五粮液业绩将揭晓,你更期待哪一家?|一周财报前瞻|每日速讯
四月末,A股上市公司年报披露接近尾声。同花顺数据显... 更多>
2023广东省博物馆五一展览活动有哪些?
2023广东省博物馆五一展览活动有哪些?一眼千万年——... 更多>

捷达VS7什么平台_捷达vs7是什么平台

【快播报】后背毛囊炎怎么治好_后背

热推荐:一年级家长会心得简短100字

维生素e可以擦脸吗有什么效果_维生

环球速递!福建白水洋图片_白水洋在

天天关注:暁_对于暁简单介绍

当前热点-晾鹰台集蒙古诸部落慰劳遣

晾马台村_对于晾马台村简单介绍

【安委办动态】石湖荡镇恬润新苑开

每日速读!宇环数控:签订1.07亿元日