对接阿里云的ai,流输出,隐藏前端token

问ai写的,然后是一次性返现,然后问ai调整,就是一点点返回

  /// <summary>
  /// 流式对话接口 - 真正的逐块转发
  /// </summary>
  [HttpPost()]
  public async Task ChatCompletions()
  {
      try
      {
          // 读取原始请求体
          string requestBody;
          using (var reader = new StreamReader(Request.Body))
          {
              requestBody = await reader.ReadToEndAsync();
          }

          _httpClient.DefaultRequestHeaders.Clear();
          _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {ALiCloudApiKey}");

          // 使用 SendAsync 而不是 PostAsync
          var request = new HttpRequestMessage(HttpMethod.Post, AliCloudUrl)
          {
              Content = new StringContent(requestBody, Encoding.UTF8, "application/json")
          };

          // 关键:使用 HttpCompletionOption.ResponseHeadersRead
          using var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

          // 复制响应状态码
          Response.StatusCode = (int)response.StatusCode;

          // 设置流式响应头
          Response.Headers.ContentType = "text/event-stream";
          Response.Headers.CacheControl = "no-cache";
          Response.Headers.Connection = "keep-alive";

          // 获取响应流并直接复制(真正的流式传输)
          using var responseStream = await response.Content.ReadAsStreamAsync();
          await responseStream.CopyToAsync(Response.Body);
      }
      catch (Exception ex)
      {
          if (!Response.HasStarted)
          {
              Response.StatusCode = 500;
              await Response.WriteAsync($"Error: {ex.Message}");
          }
      }
  }

关键在于是这个

          // 关键:使用 HttpCompletionOption.ResponseHeadersRead
          using var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

前面一致是,然后在.,HttpCompletionOption.ResponseHeadersRead,是错误的

image

 

posted @ 2026-05-18 11:16  世人皆萌  阅读(25)  评论(0)    收藏  举报