当前位置: 首页 > news >正文

Dify接口api对接,流式接收流式返回(.net)

试了好多种方法除了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";

        // 配置响应头以支持SSE
        var 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();
            }
        }
    }


}

最终测试结果-流式返回:

http://www.dtcms.com/a/108582.html

相关文章:

  • Java迭代器【设计模式之迭代器模式】
  • C++ 中的类型处理与类型别名(二十六)
  • 车辆选择解决方案
  • 5.模型训练-毕设篇3
  • 字节跳动 UI-TARS 汇总整理报告
  • 核桃派2B:opencv python的 Canny findContours得到两个非常接近的轮廓,角点有几个像素的差距,如何处理?
  • 使用 Flutter 制作地图应用
  • 封装一套通用echats
  • 电子电气架构 --- 域控制器和EE架构关系
  • 时间字段前端VO接收用String,后端用Date
  • 防火墙和端口开关
  • Kafka和RocketMQ零拷贝对比
  • ABeam 德硕 | 中国汽车市场(2)——新能源车的崛起与中国汽车市场机遇与挑战
  • nuxt3 部署到服务器配置
  • 关于 数据库表关联查询(JOIN) 和 子查询(Subquery) 的详细对比,包括定义、语法、优缺点、使用场景及示例代码,并以表格总结关键差异
  • gitblit服务启动报错Cannot assign requested address: bind
  • Spring Boot3使用Spring AI通过Ollama集成deepseek
  • 从技术视角看海外服务器免备案机制——以AWS云为例
  • C#:DispatcherTimer计时器
  • WHAT - 从后端开发的 trace 追踪认识请求的完整流转过程
  • 洛谷 P1032 [NOIP 2002 提高组] 字串变换
  • 第一期:Spring Web MVC 入门 [特殊字符](基础概念 + 环境搭建)
  • 解锁医疗行业软件 UI 设计密码,打造高效就医体验
  • Linux NUC小主机化身视频会议服务器: 技术优势与部署实战
  • 少儿编程 中国电子学会软件编程C语言/C++等级考试二级历年真题答案解析【持续更新 已更新21题】
  • android设备出厂前 按键测试 快速实现-屏蔽Home,Power等键
  • 群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)
  • 亚马逊云科技携手 DeepSeek:开启企业级生成式 AI 新征程
  • 通信算法之253: 802.16(WiMAX)的FFT-CP长度
  • 力扣HOT100之链表:160. 相交链表