更改原始IP - 绕过连接的缓存

时间:2013-08-12 18:34:16

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

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

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

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

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

添加:

如果我将我的应用程序拆分为两个独立的应用程序,每个应用程序都使用自己的源ip,那么这是一种强制它运行的强力方法吗?换句话说,每个进程只执行缓存吗? (我认为是这样)。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

这是一个快速的解决方案,您可以尝试而不反思底层库:

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

http://api.address.com/restful/get?param1=a&param2=b&安培;垃圾= 13929348398

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

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