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余條線路開展車路協同智慧高速公路建設

生態環境部:今年一季度全國地表水水質提升
