c# - 如何限制 Web Api 中的请求?

标签 c# .net asp.net-web-api throttling

我正在尝试通过以下方式实现请求限制:

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 个原因。

  1. 缓存不提供不同线程之间的互锁控制,因此可以同时处理多个请求,从而引入额外的调用以跳过限制。
  2. 过滤器在 Web API 管道中的处理“太晚了”,因此在您决定不应处理该请求之前,已经花费了大量资源。应该使用 DelegatingHandler,因为它可以设置为在 Web API 管道的开头运行,并在执行任何其他工作之前切断请求。
  3. Http 缓存本身是依赖项,可能不适用于新的运行时,例如自托管选项。最好避免这种依赖。
  4. 上例中的缓存并不能保证它在调用之间存在,因为它可能会因内存压力而被删除,尤其是低优先级时。
  5. 虽然这不是太糟糕的问题,但将响应状态设置为“冲突”似乎并不是最佳选择。最好改用“429-请求太多”。

在实现 throttle 的过程中,还有更多的问题和隐藏的障碍需要解决。有免费的开源选项可用。我建议看看 https://throttlewebapi.codeplex.com/ ,例如。

关于c# - 如何限制 Web Api 中的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817300/

相关文章:

c# - Azure 服务总线,确定 OnMessage 是否停止处理

c# - 使用 Linq 检查列表中的字符串是否包含特定字符串

c# - 没有页面扩展的 URL 重写规则

c# - 类型转换和继承的乐趣

c# - 在 Windows 机器上有没有办法以编程方式找出哪个应用程序负责打开具有特定扩展名的文件?

c# - 从 asp.net webapi 下载并返回文件

c# - 在 Application_AquireRequestState 事件中用 POST 数据重写 Url

c# - 来自控制台应用程序身份验证 header 的 ASP.NET Web Api 调用

C#语言 : Garbage Collection, SuppressFinalize

c# - SOLR/C# - 是否可以查询一个 SOLR 索引,并从另一个索引附加文档?