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

C#电影API获取动态URL参数及外部API调用连接异常问题

问题分析与解决方案

你的代码存在两个核心问题,直接导致了"connection was refused by the localhost"错误:

1. 异步方法未正确等待

MovieDB.Get是异步方法(返回Task<object>),但你在接口路由处理中直接同步调用它,未使用await关键字。这种操作会导致异步请求的上下文被提前终止,HTTP请求还未完成就触发连接异常。

修改接口代码,补上async和await,同时明确路由参数类型:

var builder = WebApplication.CreateBuilder(args);

// 注册MovieDB为单例,保证资源复用
builder.Services.AddSingleton<MovieDB>();

var app = builder.Build();

app.MapGet("/movie/{id}", async (string id, MovieDB movieDb) =>
{    
    var response = await movieDb.Get($"/movie/{id}");
    return response;
});

app.Run();

2. HttpClient的不当实例化

每次调用MovieDB.Get都新建HttpClient实例,会快速耗尽系统套接字资源,进而引发连接拒绝错误。正确做法是复用HttpClient实例,通过依赖注入实现单例管理。

修改MovieDB类:

public class MovieDB
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;

    // 通过构造函数注入HttpClient和配置项
    public MovieDB(HttpClient httpClient, IConfiguration configuration)
    {
        _httpClient = httpClient;
        _apiKey = configuration["MovieDbApiKey"];
        _httpClient.BaseAddress = new Uri(configuration["MovieDbBaseUrl"]);
    }

    public async Task<string> Get(string uri)
    {
        try
        {
            var response = await _httpClient.GetAsync($"{uri}?api_key={_apiKey}");
            response.EnsureSuccessStatusCode();

            return await response.Content.ReadAsStringAsync();
        }
        catch (HttpRequestException ex)
        {
            // 可添加自定义异常处理逻辑,比如返回友好错误
            throw new InvalidOperationException("无法获取电影详情", ex);
        }
    }
}

同时在appsettings.json中配置基础地址和API密钥(避免硬编码):

{
  "MovieDbBaseUrl": "https://api.themoviedb.org/3",
  "MovieDbApiKey": "你的实际API密钥"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:36:06