HttpClient 使用(二)流式請求
原文地址:http://www.rzrgm.cn/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 }
效果
這里我們使用控制臺簡單展示一下

本文來自博客園,作者:一事冇誠,轉載請注明原文鏈接:http://www.rzrgm.cn/ysmc/p/18780674

浙公網安備 33010602011771號