試了好多種方法除了Console.WriteLine()能打印出來,試了好些方法都不行,不是報錯就是打印只有一行,要么就是接收完才返回...下面代碼實現調用api接收流式數據,并進行流式返回給前端:
using Furion.HttpRemote;
using System.Net.Http.Headers;
using System.Text;namespace Admin.NET.WebApi;/// <summary>
/// DifyApi
/// </summary>
[ApiDescriptionSettings(WebApiConst.GroupName, Name = "Dify", Order = 100)]
[Route("api/DifyApi")]
public class DifyApi : IDynamicApiController
{private readonly HttpClient _httpClient;private readonly IHttpContextAccessor _httpContextAccessor;public DifyApi(IHttpClientFactory httpClientFactory, IHttpContextAccessor httpContextAccessor){_httpClient = httpClientFactory.CreateClient();_httpContextAccessor = httpContextAccessor;}/// <summary>/// 調用外部接口并傳遞參數和鑒權/// </summary>/// <param name="parameters">請求參數</param>/// <returns>外部接口的響應內容</returns>[ApiDescriptionSettings(Name = "CallExternalApiWithAuth", Description = "調用外部接口并傳遞參數和鑒權", Order = 990), HttpPost][DisplayName("調用外部接口并傳遞參數和鑒權")][AllowAnonymous]public async Task CallExternalApiWithAuth(dify_chat_message parameters){const string apiKey = "app-pLa4mNcKJahcbqiYYHLJUYoW";const string apiUrl = "http://localhost/v1/chat-messages";// 配置響應頭以支持SSEvar response = _httpContextAccessor.HttpContext.Response;response.Headers.Append("Content-Type", "text/event-stream");response.Headers.Append("Cache-Control", "no-cache");response.Headers.Append("Connection", "keep-alive");var client = _httpClient;client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));/*// 確保請求啟用流式返回if (parameters.stream == null){parameters.stream = true;}*/using var request = new HttpRequestMessage(HttpMethod.Post, apiUrl);request.Content = new StringContent(JsonConvert.SerializeObject(parameters), Encoding.UTF8, "application/json");using var apiResponse = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);apiResponse.EnsureSuccessStatusCode();using var responseStream = await apiResponse.Content.ReadAsStreamAsync();using var reader = new StreamReader(responseStream);// 逐行讀取并立即發送響應while (!reader.EndOfStream){var line = await reader.ReadLineAsync();if (line != null){await response.WriteAsync(line + "\n");await response.Body.FlushAsync();}}}}
最終測試結果-流式返回: