我需要多次调用相同的API,但根据某些参数使用不同的IP。
我已经实现了这个SO问题中的代码:如何更改HttpWebRequest中的原始IP
当我需要为我调用的 API 指定单个 IP 时,这种方法效果很好,但现在我需要根据我的要求使用多个 IP,并且这种方法似乎不再有效。 API URL 似乎已被缓存,后续调用将使用该 IP,而不是我希望在每次调用时设置的特定 IP。
我需要一种方法,让我可以非常具体地为每个请求选择源 IP。
添加:
如果我将我的应用程序分成两个单独的应用程序,每个应用程序都使用自己的源 IP,这是否是一种强制其工作的强力方法?换句话说,缓存是否仅针对每个进程执行? (我认为是这样)。
使用
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();
这是一个快速解决方案,您可以尝试而无需考虑底层库:
在目标 URL 末尾添加一些随机垃圾,例如
http://api.address.com/restful/get?param1=a¶m2=b&junk=13929348398
您可以生成 guid、随机数、纳米时间等。这种方法非常适合防止缓存响应——在这种情况下也应该能很好地工作。 您认为这对您有用吗? 假设 API 忽略最后一个参数...
更好的是,您可以附加源 IP 的哈希值来代替随机数,以实际利用您观察到的缓存行为。