【问题标题】:Change originating IP - circumventing caching of connections更改原始 IP - 规避连接缓存
【发布时间】:2013-08-12 18:34:16
【问题描述】:

我需要多次调用同一个 API,但根据某些参数使用不同的 IP。

我已经实现了这个 SO 问题中的代码:how to change originating IP in HttpWebRequest

当我需要为我正在调用的 API 指定单个 IP 时,这很有效,但现在我需要根据我的要求从多个 ip 中使用,并且这种方法似乎不再有效。 api url 似乎已被缓存,后续调用将使用该 IP,而不是我希望在每次调用时设置的特定 IP。

我需要一种方法,可以让我非常具体地为每个请求选择源 IP。

添加:

如果我将我的应用程序拆分为两个单独的应用程序,每个应用程序都使用自己的源 ip,这会是强制其工作的蛮力方法吗?换句话说,缓存是否仅针对每个进程执行? (我认为是这样)。

【问题讨论】:

  • 有许多 Web 服务器和 Web 服务缓存配置。他们可能在另一端有自定义缓存。
  • 远程缓存与这个问题无关。

标签: c# .net web-services api webrequest


【解决方案1】:

使用HttpWebRequest.ConnectionGroupName,您应该能够绕过ServicePoint 连接重用。

var hr = (HttpWebRequest)WebRequest.Create("http://google.com?");
hr.ConnectionGroupName = hr.RequestUri.ToString(); //Different connection pool per url. Might be better to make this random.
hr.GetResponse();

或者,您可以使用ServicePoint.CloseConnectionGroup 强制关闭组。默认组为空。

var hr = (HttpWebRequest)WebRequest.Create("http://google.com");
hr.ServicePoint.CloseConnectionGroup(null);
hr.GetResponse();

【讨论】:

  • 请问,我可以保留两个池,使用我自己的自定义名称吗?这段代码的问题是我试图用不同的 ip 在同一个 URL 调用同一个 api。
  • 是的,连接池是按组名分组的。指定不同的组名将创建另一个连接池(因此不同的本地 ip)。您也可以调用 CloseConnectionGroup 释放连接池,导致 ServicePoint 创建另一个(因此不同的本地 ip)。
  • 厉害,我试试
  • 所以我要尝试:创建请求,设置连接名称,分配 BindIPEndPointDelegate 委托......按此顺序
  • @boomhauer,什么没用?你也试过 CloseConnectionGroup 吗?
【解决方案2】:

这是一个无需考虑底层库即可尝试的快速解决方案:

在目标 URL 的末尾添加一些随机垃圾,例如

http://api.address.com/restful/get?param1=a&param2=b&junk=13929348398

您可以生成 guid、随机数、纳米时间等。这种方法非常适用于防止响应缓存 - 在这种情况下也应该很好用。你认为这对你有用吗?假设 API 忽略了最后一个参数...

更好的是,您可以附加源 IP 的哈希值而不是随机数,以实际利用您观察到的缓存行为。

【讨论】:

  • api 调用已经在查询字符串中传递了不同的参数,所以我认为连接仅基于 url(或 url 和路径)在内部缓存。
  • 引用链接问题的评论:奇怪的是,它为任何地址相同的远程 IPAddress 的 Uri 返回相同的 ServicePoint。
  • 明白了..回到绘图板;)
  • 你引起了我的兴趣——我能够找到这个 SO 问题(答案非常丰富)。 stackoverflow.com/questions/6114793/… 我认为它与您遇到的问题相匹配,并列出了一些解决方法。编辑这实际上是您引用的评论的问题(但不是当前问题中链接的问题)。很抱歉指出您显然也已经看过这个了。
  • 也许设置 KeepAlive = false 在您的情况下是可接受的解决方案?
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多