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
相关产品推荐
相关产品推荐

