当调用
GET
端点时,它会返回 200 状态代码和响应正文。但每三次调用 API 时,应返回不同的状态和空响应正文。如何跟踪 API 调用计数?
第一次和第二次来电的回复:
Status Code: 200
Response: {
message: "OK"
}
第三次调用 API 的响应:
Status Code: 503
Response: {
}
一般情况下,为了满足安全和业务逻辑的需要,我们经常会在接口中设置相关的访问限制。但接口的访问限制通常不仅仅只是限制访问次数,还可以使用字典来存储IP地址,并设置相应的访问次数来限制对用户IP地址等标识的访问次数,从而系统可以更全面。且全面。在问题描述中,您可以使用变量来保存调用次数。每次调用 API 时,该计数都会递增。当计数达到3次时,修改返回的状态码和响应体。每次调用 API 时,该变量都会递增。然后,允许调用逻辑根据变量的值返回不同的状态代码,下面是一个可以用作参考的用例:
public class CountController : ControllerBase
{
private static int callCount = 0;
[HttpGet]
public IActionResult Get()
{
callCount++;
var statusCode = (callCount % 3 == 0) ? 503 : 200;
var message = (statusCode == 503) ? "Service not available" : $"OK, Call Count: {callCount}";
if (callCount % 3 == 0)
{
return StatusCode(statusCode);
}
return StatusCode(statusCode, new { message });
}
}
如果您使用分布式系统,您可以将缓存数据存储在内存中,并在应用程序集群的所有实例之间共享。然后您可以使用AddDistributedMemoryCache,以便不同的应用程序实例可以共享相同的缓存数据。它使用ASP.NET Core的分布式缓存机制,适合分布式应用程序:
private readonly IDistributedCache _cache;
public YourController(IDistributedCache cache)
{
_cache = cache;
}
[HttpGet]
public IActionResult Get()
{
var callCountBytes = _cache.Get("callCount");
var callCount = (callCountBytes != null) ? BitConverter.ToInt32(callCountBytes, 0) + 1 : 1;
var statusCode = (callCount % 3 == 0) ? 503 : 200;
var message = (statusCode == 503) ? "Service not available" : $"OK, Call Count: {callCount}";
if (callCount % 3 == 0)
{
return StatusCode(statusCode);
}
_cache.Set("callCount", BitConverter.GetBytes(callCount));
return StatusCode(statusCode, new { message });
}
}
当我前两次使用 get 方法时:
当我第三次使用get方法时: