GET 端点 ASP.NET Core Web API 将返回带有响应正文的 200 OK。但每 3 次调用 API 时,应发送不同的状态代码

问题描述 投票:0回答:1

当调用

GET
端点时,它会返回 200 状态代码和响应正文。但每三次调用 API 时,应返回不同的状态和空响应正文。如何跟踪 API 调用计数?

第一次和第二次来电的回复:

Status Code: 200

Response: {
    message: "OK"
}

第三次调用 API 的响应:

Status Code: 503

Response: {
    
}
asp.net-core-webapi asp.net-apicontroller
1个回答
0
投票

一般情况下,为了满足安全和业务逻辑的需要,我们经常会在接口中设置相关的访问限制。但接口的访问限制通常不仅仅只是限制访问次数,还可以使用字典来存储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方法时:

© www.soinside.com 2019 - 2024. All rights reserved.