You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core API调用OpenAI Completions接口返回404问题排查

问题排查与修复方案

以下是代码中存在的几个明显问题及对应的修复方式:


1. URL大小写不匹配

OpenAI的API路由严格区分大小写,你代码中使用的https://api.openai.com/V1/completions里的V1为大写,而Postman中是小写的v1,这是导致404的核心原因。

修复:将URL改为小写路径:

var targetUrl = $"https://api.openai.com/v1/completions";

2. 请求体字段拼写错误

代码中reqBody.temprature拼写错误,正确的字段名应为temperature(少了字母e)。虽然这不会直接引发404,但会导致API无法识别温度参数,后续可能返回参数校验错误。

修复:修正字段名拼写,同时确保OpenAIRequest类的属性名与JSON字段一致:

// 修正代码中的赋值
reqBody.temperature = pSettings.Temperature;

// 确保OpenAIRequest类的属性定义正确
public class OpenAIRequest
{
    public string model { get; set; }
    public string prompt { get; set; }
    public int max_tokens { get; set; }
    public int temperature { get; set; } // 正确的属性名
}

3. 异步方法的同步调用风险

代码中使用.Result同步调用SendAsync和ReadAsStringAsync,在ASP.NET Core环境中极易导致死锁,违反异步编程规范。

修复:改用await关键字调用异步方法:

var response = await client.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();

4. HttpClient实例化不当

在方法内频繁创建HttpClient实例会导致Socket资源耗尽,不符合.NET Core的最佳实践。

修复:通过依赖注入复用HttpClient实例:

  1. 在Program.cs中注册HttpClient服务:
builder.Services.AddHttpClient();
  1. 在业务类/控制器中注入HttpClient:
private readonly HttpClient _httpClient;

public YourService(HttpClient httpClient)
{
    _httpClient = httpClient;
}
  1. 改造后的调用方法:
async Task<string> getOpenAIData(OpenAISettings pSettings, string promptValue)
{
    var targetUrl = $"https://api.openai.com/v1/completions";

    OpenAIRequest reqBody = new OpenAIRequest();
    reqBody.model = pSettings.Model;
    reqBody.prompt = promptValue;
    reqBody.temperature = pSettings.Temperature;
    reqBody.max_tokens = pSettings.MaxTokens;

    using(var request = new HttpRequestMessage(HttpMethod.Post, targetUrl))
    {
        request.Headers.Add("Authorization", "Bearer my-secret-code");
        request.Content = JsonContent.Create(reqBody); // JsonContent默认已设置application/json头,无需重复指定

        var response = await _httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode(); // 主动抛出HTTP错误,便于调试
        var json = await response.Content.ReadAsStringAsync();
        return json;
    }
}

5. 冗余的Content-Type设置

代码中先通过JsonContent.Create指定了Content-Type,又手动重复设置,属于冗余操作,可直接移除。


内容的提问来源于stack exchange,提问作者pachyderm94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:31:16