【问题标题】:ASP MVC: Can I drop a client connection programatically?ASP MVC:我可以以编程方式断开客户端连接吗?
【发布时间】:2016-04-14 22:19:06
【问题描述】:

我有一个在负载平衡器后面运行的 ASP.NET Web API 应用程序。一些客户端将一个繁忙的 HTTP 连接保持活动的时间过长,从而创建了不必要的亲和性并导致某些服务器实例的负载过高。为了解决这个问题,我希望在短时间内优雅地关闭一个请求过多的连接(从而迫使客户端重新连接并选择不同的服务器实例),同时保持低流量连接无限期地存活。因此我不能使用静态配置。

我可以调用一些 API 来标记“回答此问题然后关闭连接”的请求吗?或者我可以简单地添加 ASP.NET 将看到的 Connection: close HTTP 标头并为我关闭连接吗?

【问题讨论】:

  • 我很想知道您如何判断请求来自同一个 HTTP 连接?
  • 好问题。我也希望得到答复!
  • @David 您当然可以分辨出他们来自哪个 IP 地址,但如果您有 100 个来自同一家公司的用户,那么他们都是相同的 IP 地址,您将全部删除。

标签: asp.net asp.net-mvc http azure azure-web-app-service


【解决方案1】:

看起来适合您情况的好解决方案是称为Dynamic IP restriction 的内置IIS 功能。 “为了提供这种保护,该模块会暂时阻止发出异常大量并发请求或在短时间内发出大量请求的 HTTP 客户端的 IP 地址。”

Azure Web Apps 支持: https://azure.microsoft.com/en-us/blog/confirming-dynamic-ip-address-restrictions-in-windows-azure-web-sites/


如果这是有用的答案,请将其标记为有用或将其标记为答案。谢谢!

【讨论】:

  • 谢谢,但不起作用。这将阻止该实例上的 IP 地址并返回诸如 401 或 403 之类的错误。我想返回 200 并关闭连接,强制客户端重新连接。
  • 抱歉耽搁了。我做了一些研究并询问队友是否做了类似的事情,我需要说我没有找到现成的解决方案。有github.com/stefanprodan/WebApiThrottle 我认为可以在您的情况下部分使用它并实施节流逻辑,从而不会导致阻塞,而是返回您想要的。很抱歉无法提供帮助:-(
【解决方案2】:

我不能 100% 确定这是否适用于您的情况,但过去我不得不在地理上阻止来自特定 IP 地址的人以及来自普通代理的人。我创建了以下授权属性类:

http://www.asp.net/web-api/overview/security/authentication-filters

In 将通过返回 HttpStatusCode.BadRequest 根据 IP 地址将人转出。对于每个请求,您都必须检查数据库中的错误 ips 列表并从那里开始。也许您可以处理其余的客户端,因为它们会出现大量错误。

【讨论】:

  • 谢谢,但我不关心客户端 IP 地址。我只是想阻止客户端将实例固定在服务器中。
【解决方案3】:

写一个action filter,它会为“被阻止的”IP 地址返回一个 302 Found 响应。我希望客户端会关闭当前连接并在新位置重试(可能与原始请求的 URL 相同)。

【讨论】:

  • 谢谢,但返回 302 是 REST 接口中的一项重大更改。我只想在发送响应后关闭连接,并且只有在来自该连接的给定数量的请求(不是 IP 地址)之后。
  • 为什么返回 302 是一项重大更改?它应该对客户透明。
猜你喜欢
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2019-01-30
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多