我正在尝试通过以下方式实现请求限制:
Best way to implement request throttling in ASP.NET MVC?
我已将该代码提取到我的解决方案中,并使用以下属性装饰了一个 API Controller 端点:
[Route("api/dothis/{id}")]
[AcceptVerbs("POST")]
[Throttle(Name = "TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
[Authorize]
public HttpResponseMessage DoThis(int id) {...}
这会编译,但不会命中属性的代码,并且限制不起作用。我没有收到任何错误。我错过了什么?
最佳答案
建议的解决方案不准确。至少有 5 个原因。
- 缓存不提供不同线程之间的互锁控制,因此可以同时处理多个请求,从而引入额外的调用以跳过限制。
- 过滤器在 Web API 管道中的处理“太晚了”,因此在您决定不应处理该请求之前,已经花费了大量资源。应该使用 DelegatingHandler,因为它可以设置为在 Web API 管道的开头运行,并在执行任何其他工作之前切断请求。
- Http 缓存本身是依赖项,可能不适用于新的运行时,例如自托管选项。最好避免这种依赖。
- 上例中的缓存并不能保证它在调用之间存在,因为它可能会因内存压力而被删除,尤其是低优先级时。
- 虽然这不是太糟糕的问题,但将响应状态设置为“冲突”似乎并不是最佳选择。最好改用“429-请求太多”。
在实现 throttle 的过程中,还有更多的问题和隐藏的障碍需要解决。有免费的开源选项可用。我建议看看 https://throttlewebapi.codeplex.com/ ,例如。
关于c# - 如何限制 Web Api 中的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817300/