我正在尝试通过以下方式实现请求限制:
在 ASP.NET MVC 中实现请求限制的最佳方法? https://stackoverflow.com/questions/33969/best-way-to-implement-request-throttling-in-asp-net-mvc
我已将该代码提取到我的解决方案中,并使用以下属性装饰 API 控制器端点:
[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-请求太多”来代替。
实施节流的过程中还有很多问题和隐藏的障碍需要解决。有免费的开源选项可用。我建议看看https://throttlewebapi.codeplex.com/ https://throttlewebapi.codeplex.com/, 例如。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)