簡體   English   中英

C# 並行 HTTP GET 請求“請求過多”錯誤

[英]C# parallel HTTP GET request "Too many requests" error

我正在嘗試同時向 API 發出多個 GET 請求,但是在嘗試執行大量請求(1600 個項目)時出現錯誤(“請求過多”)。

以下是代碼片段。

稱呼:

var metadataItemList = await GetAssetMetadataBulk(unitHashList_Unique); 

方法:

private static async Task<List<MetadataModel>> GetAssetMetadataBulk(List<string> assetHashes)
        {
            List<MetadataModel> resultsList = new();
            int batchSize = 100;
            int batches = (int)Math.Ceiling((double)assetHashes.Count() / batchSize);

            for (int i = 0; i < batches; i++)
            {
                var currentAssets = assetHashes.Skip(i * batchSize).Take(batchSize);
                var tasks = currentAssets.Select(asset => EndpointProcessor<MetadataModel>.LoadAddress($"assets/{asset}"));
                resultsList.AddRange(await Task.WhenAll(tasks));
            }
            return resultsList;
        }

該方法以 100 個批次並行運行任務,它適用於少量請求(<~300),但對於大量請求(~1000+),我收到上述“請求過多”錯誤。 我嘗試單步執行代碼,令我驚訝的是,當我手動單步執行它時它起作用了。 但我需要它自動工作。

有什么方法可以減慢請求速度,或者有什么更好的方法可以在保持相對良好性能的同時以某種方式規避錯誤?

該請求沒有返回“Retry-After”header,我也不知道如何在 C# 中實現它。 非常感謝有關要編輯的代碼或文檔方向的任何輸入!

以下是我用來發送 HTTP 請求的 Class:

class EndpointProcessor<T>
{
    public static async Task<T> LoadAddress(string url)
    {
        using (HttpResponseMessage response = await ApiHelper.apiClient.GetAsync(url))
        {
            if (response.IsSuccessStatusCode)
            {
                T result = await response.Content.ReadAsAsync<T>();
                return result;
            }
            else
            {
                //Console.WriteLine("Error: {0} ({1})\nTrailingHeaders: {2}\n", response.StatusCode, response.ReasonPhrase, response.TrailingHeaders);
                throw new Exception(response.ReasonPhrase);
            }
        }
    }
}

您可以使用信號量作為當前活動線程的限制器。 將 Semaphore 類型的字段添加到您的 API 客戶端並使用最大計數和初始計數(例如 250 或您確定的運行請求的安全最大數量)對其進行初始化。 在您的方法ApiHelper.apiClient.GetAsync()中,在建立真正的連接之前,嘗試獲取信號量,然后在完成/失敗下載后釋放它。 這將允許您強制執行最大數量的並發運行請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM