【发布时间】:2021-07-17 18:38:23
【问题描述】:
目前我正在开发一个 .net 核心 web api 项目,它正在从外部 web api 获取数据。他们最后有一个 25 的并发速率限制器(允许 25 个并发 api 调用)。第 26 次 API 调用将失败。
所以我想在我的 Web API 项目上实现并发 API 速率限制器,并且需要跟踪第 26 个失败的 API 调用并需要重试(可能是 get 或 post 调用)。我的 api 代码中有多个获取请求和发布请求
以下是我的 web api 中的 httpservice.cs
public HttpClient GetHttpClient()
{
HttpClient client = new HttpClient
{
BaseAddress = new Uri(APIServer),
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Authorization", ("Bearer " + Access_Token));
return client;
}
private HttpClient Client;
public async Task<Object> Get(string apiEndpoint)
{
Client = GetHttpClient();
HttpResponseMessage httpResponseMessage = await Client.GetAsync(apiEndpoint);
if (httpResponseMessage.IsSuccessStatusCode)
{
Object response = await httpResponseMessage.Content.ReadAsStringAsync();
return response;
}
else if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
{
//need to track failed calls
return StatusCode(httpResponseMessage.StatusCode.GetHashCode());
}
}
public async Task<Object> Post(string apiEndpoint, Object request)
{
Client = GetHttpClient();
HttpResponseMessage httpResponseMessage = await Client.PostAsJsonAsync(apiEndpoint, request);
if (httpResponseMessage.IsSuccessStatusCode)
{
return await httpResponseMessage.Content.ReadAsAsync<Object>();
}
else if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
{
//need to track
return StatusCode(httpResponseMessage.StatusCode.GetHashCode());
}
}
如何在上面的示例中限制并发 api 调用
SemaphoreSlim _semaphoregate = new SemaphoreSlim(25);
await _semaphoregate.WaitAsync();
_semaphoregate.Release();
这行得通吗?
AspNetCoreRateLimit nuget 包在这里有用吗?这会限制上述示例的并发性吗?
请帮忙。
【问题讨论】:
-
我知道的最简单的解决方案是使用 SemaphoreSlim 或 TPL 数据流块之类的东西来实现具有最大并行度的受限并发。您是否已经考虑过使用这种方法?
-
@EnricoMassone 是的,如问题所示,考虑了 SemaphoreSlim,但在这里可以工作吗?但是这里怎么用?获取和发布请求?
标签: c# asp.net-web-api concurrency asp.net-core-webapi semaphore