2

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

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

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

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

添加:

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

4

2 回答 2

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();
于 2013-08-12T19:43:24.363 回答
0

这是一个快速的解决方案,您可以在不考虑底层库的情况下尝试:

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

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

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

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

于 2013-08-12T18:43:56.070 回答