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

调用Spotify Get Recently Played Tracks接口批量获取用户数据时遇504错误

问题诊断与修复方案

核心问题分析

你的代码存在几个关键问题,直接导致了后续用户请求出现504网关超时:

  • HttpClient重复创建:每次请求都新建HttpClient实例,会造成TCP连接无法复用,快速耗尽系统可用端口,后续请求无法建立有效连接,触发网关超时。
  • 请求头设置错误:GET请求不需要ContentType头,将其添加到请求Headers属于无效操作,可能干扰Spotify服务器的请求处理逻辑。
  • 缺少临时错误重试机制:Spotify API偶尔会出现临时网关波动,没有重试逻辑会导致单次失败直接记录错误,无法应对瞬时故障。

具体修复步骤

  1. 复用HttpClient实例
    不要每次请求都创建新的HttpClient,在ASP.NET环境下推荐使用IHttpClientFactory注入(官方推荐方案),或者声明静态HttpClient实例(注意线程安全),以此复用TCP连接池,避免端口耗尽问题。

  2. 修正请求头配置
    移除错误的ContentType头,添加Accept头明确告知服务器你接受JSON格式响应,符合API规范:

    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
  3. 添加指数退避重试逻辑
    针对504、502这类临时服务器错误,实现指数退避重试(重试间隔逐步递增),提高请求成功率。

  4. 优化请求间隔
    结合连接复用后,设置几百毫秒的请求间隔(如300ms)比几分钟更合理,既避免触发API速率限制,又不会浪费等待时间。

修改后的代码示例(基于ASP.NET Core的IHttpClientFactory)

// 先在Program.cs中注册HttpClient:builder.Services.AddHttpClient();
private readonly IHttpClientFactory _httpClientFactory;
private readonly ISpotifyDataErrorLogRepository _spotifyDataErrorLogRepository;

// 构造函数注入依赖
public YourService(IHttpClientFactory httpClientFactory, ISpotifyDataErrorLogRepository spotifyDataErrorLogRepository)
{
    _httpClientFactory = httpClientFactory;
    _spotifyDataErrorLogRepository = spotifyDataErrorLogRepository;
}

private async Task<SpotifyRecentlyPlayedModel> GetSpotifyRecentlyPlayedData(DateTime afterTime, string accessToken, long spotifyUserMappingId)
{
    long afterTimeTimestamp = new DateTimeOffset(afterTime).ToUnixTimeMilliseconds();
    string requestUri = $"https://api.spotify.com/v1/me/player/recently-played?after={afterTimeTimestamp}";
    
    // 从工厂获取复用的HttpClient实例
    using HttpClient client = _httpClientFactory.CreateClient();
    using HttpRequestMessage request = new(HttpMethod.Get, requestUri);
    
    // 设置合法请求头
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
    int retryCount = 0;
    const int maxRetries = 3;
    HttpResponseMessage response = null;
    
    do
    {
        try
        {
            response = await client.SendAsync(request);
            if (response.IsSuccessStatusCode)
            {
                string apiResponse = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<SpotifyRecentlyPlayedModel>(apiResponse);
            }
            // 仅针对5xx类服务器错误重试
            if ((int)response.StatusCode >= 500 && retryCount < maxRetries)
            {
                retryCount++;
                await Task.Delay(1000 * (int)Math.Pow(2, retryCount)); // 指数退避间隔
                continue;
            }
            // 记录非临时错误
            await _spotifyDataErrorLogRepository.AddAsync(new()
            {
                SpotifyUserMappingId = spotifyUserMappingId,
                ErrorCode = (int)response.StatusCode,
                ErrorMessage = response.ReasonPhrase
            });
            break;
        }
        catch (HttpRequestException)
        {
            // 网络异常也触发重试
            if (retryCount < maxRetries)
            {
                retryCount++;
                await Task.Delay(1000 * (int)Math.Pow(2, retryCount));
                continue;
            }
            throw;
        }
        finally
        {
            response?.Dispose();
        }
    } while (retryCount < maxRetries);

    return null;
}

额外注意事项

  • 检查Spotify API速率限制:504错误也可能是触发了应用级或用户级速率限制,可通过响应头X-RateLimit-Remaining和X-RateLimit-Reset确认。
  • 验证AccessToken有效性:后续用户的AccessToken可能过期,若错误码为401,需添加Token刷新逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:37:09