ASP.NET Core Web API 流式返回,逐字顯示-當(dāng)前焦點
2023-04-23 22:19:36 來源:博客園 小 中
Websocket、SSE(Server-Sent Events)和長輪詢(Long Polling)都是用于網(wǎng)頁和服務(wù)端通信的技術(shù)。
Websocket是一種全雙工通信協(xié)議,能夠?qū)崿F(xiàn)客戶端和服務(wù)端之間的實時通信。它基于TCP協(xié)議,并且允許服務(wù)器主動向客戶端推送數(shù)據(jù),同時也允許客戶端向服務(wù)器發(fā)送數(shù)據(jù)。
(資料圖)
SSE是一種單向通信協(xié)議,允許服務(wù)器向客戶端推送數(shù)據(jù),但不支持客戶端向服務(wù)器發(fā)送數(shù)據(jù)。SSE建立在HTTP協(xié)議上,通過在HTTP響應(yīng)中使用特殊的Content-Type和事件流(event stream)格式來實現(xiàn)。
長輪詢是一種技術(shù),客戶端向服務(wù)器發(fā)送一個請求,并且服務(wù)器保持連接打開直到有數(shù)據(jù)可以返回給客戶端。如果在指定的時間內(nèi)沒有數(shù)據(jù)可用,則服務(wù)器會關(guān)閉連接,客戶端需要重新建立連接并再次發(fā)起請求。
New Bing聊天頁面是通過WebSocket進(jìn)行通信。
Open AI的ChatGPT接口則是通過SSE協(xié)議由服務(wù)端推送數(shù)據(jù)
事實上,以上幾種方式包括長輪詢,都可以實現(xiàn)逐字顯示的效果。那還有沒有其他的辦法可以實現(xiàn)這種效果了呢?
流式響應(yīng)當(dāng)客戶端返回流的時候,客戶端可以實時捕獲到返回的信息,并不需要等全部Response結(jié)束了再處理。
下面就用ASP.NET Core Web API作為服務(wù)端實現(xiàn)流式響應(yīng)。
返回文本內(nèi)容服務(wù)端
[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枚舉有兩個值,默認(rèn)情況下使用的是ResponseContentRead
ResponseContentRead:等到整個響應(yīng)完成才完成操作
ResponseHeadersRead:一旦獲取到響應(yīng)頭即完成操作,不用等到整個內(nèi)容響應(yīng)
<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請求就是監(jiān)聽onDownloadProgress 了。
返回圖片瀏覽器是通過
Response Header中的Content-Type來解析服務(wù)端響應(yīng)體的。如果后端接口沒有設(shè)置Response.ContentType = "application/octet-stream",onprogress只會在響應(yīng)全部完成后觸發(fā)。
服務(wù)端
[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); }} 關(guān)鍵詞:
相關(guān)文章
- ASP.NET Core Web API 流式返回,逐字顯示-當(dāng)前焦點
- 基于Canal實現(xiàn)MySQL 8.0 數(shù)據(jù)庫數(shù)據(jù)同步-當(dāng)前快訊
- 即時看!Node工程的依賴包管理方式
- 中南建設(shè)為子公司文昌中南、蕪湖榮眾合計擔(dān)保7952萬元 天天速看
- 廣東統(tǒng)計局:一季度廣東實現(xiàn)地區(qū)生產(chǎn)總值突破3萬億,工業(yè)生產(chǎn)增速轉(zhuǎn)正|世界快報
- 全球微頭條丨我國已有20個省份、40余條線路開展車路協(xié)同智慧高速公路建設(shè)
- 生態(tài)環(huán)境部:今年一季度全國地表水水質(zhì)提升
- 第九章 無眠之夜
- 【速看料】東吳證券給予信德新材買入評級 2022年年報及2023年一季報點評:Q1單位盈利承壓 業(yè)績略低于市場預(yù)期
- 新華三與UNICON.UZ簽署戰(zhàn)略合作協(xié)議 焦點短訊
- 2022年年報&23年一季報交流記錄
- 每日訊息!“中特估”的重大投資方向!
- 簡訊:總算也反超了
- 短線自選池(2)4.24—4.28-環(huán)球觀察
- 網(wǎng)傳女基金經(jīng)理豪購翠湖1.7億元豪宅! 李蓓澄清:現(xiàn)在買翠湖跟2000塊以上買貴州茅臺沒什么區(qū)別
- 伊朗官員:有關(guān)部門將盡一切努力在伊朗和沙特之間開設(shè)航班 全球熱資訊
- 辦實事 暖人心——中信銀行晚報大廈支行為特殊客戶開啟綠色通道服務(wù)_全球微動態(tài)
- 曝!寶馬說謊了!兩女孩沒有辭職,只是戴了個口罩又出來了
- 環(huán)球快報:春光乍現(xiàn)!賓利女銷售不穿內(nèi)褲,下蹲時全走光,網(wǎng)友:真沒節(jié)操?
- 嫌中國麻將不好看,美國人設(shè)計“白人麻將”,滿滿的美國文化|微動態(tài)
- 央行召開2023年會計財務(wù)工作電視會議-快播報
- 敏感肌膚護(hù)膚品排行榜_敏感肌膚_環(huán)球觀察
- 惠倫晶體4月24日起停牌 控股股東擬變更為國企_天天關(guān)注
- 快看:人民海軍開展多項主題活動紀(jì)念成立74周年
- 當(dāng)前時訊:過去一年,你讀了幾本書?——第20次全國國民閱讀調(diào)查結(jié)果發(fā)布
- 新華三與UNICON.UZ簽署戰(zhàn)略合作協(xié)議 看點
- 博彥科技:接受東方證券等機(jī)構(gòu)調(diào)研-環(huán)球最新
- 俄羅斯與聯(lián)合國將磋商黑海港口農(nóng)產(chǎn)品外運(yùn)協(xié)議前景
- 最新消息:多家A股上市公司謀劃布局6G
- 宋育仁的主要活動_宋育仁簡介 天天快播
熱文推薦
基于Canal實現(xiàn)MySQL 8.0 數(shù)據(jù)庫數(shù)據(jù)同步-當(dāng)前快訊
前言服務(wù)器說明|主機(jī)名稱|操作系統(tǒng)|說明||--|--|||192......更多>
排行推薦
廣東統(tǒng)計局:一季度廣東實現(xiàn)地區(qū)生產(chǎn)總值突破3萬億,工業(yè)生產(chǎn)增速轉(zhuǎn)正|世界快報
全球微頭條丨我國已有20個省份、40余條線路開展車路協(xié)同智慧高速公路建設(shè)
生態(tài)環(huán)境部:今年一季度全國地表水水質(zhì)提升


