2013-08-12 2 views
1

Мне нужно многократно вызывать один и тот же API, но с разными IP-адресами, основанными на определенных параметрах.Изменение исходящего IP - обход кеширования соединений

Я реализовал код в этом так вопрос: how to change originating IP in HttpWebRequest

Это хорошо работало, когда мне нужно, чтобы указать один IP для API Я звоню, но теперь мне нужно использовать из нескольких изобр на основе моих требования, и этот метод больше не работает. Api url, похоже, кэшируется, и последующие вызовы будут использовать этот IP, а не конкретный, который я хочу установить для каждого вызова.

Мне нужен метод, который позволит мне очень точно выбрать IP-адрес источника для каждого запроса.

добавление:

Если я разделить мое приложение на два отдельные приложения, каждый из которых использует свой собственный IP-адрес источника, это было бы грубая сила подход, чтобы заставить его работать? другими словами, кэширование выполняется только для каждого процесса? (Я предполагаю, что это так).

+0

Существует множество конфигураций кеширования веб-серверов и веб-сервисов. У них может быть собственное кэширование на другом конце. – Paparazzi

+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. Группа по умолчанию - null.

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

Воля, могу ли я сохранить два пула, используя свои собственные имена? Проблема с этим кодом заключается в том, что я пытаюсь вызвать один и тот же URL-адрес с одним и тем же URL-адресом с разными ips. –

+0

Да, пулы соединений сгруппированы по имени группы. Указание имени другой группы создаст другой пул соединений (таким образом, другой локальный ip). Также вы можете вызвать CloseConnectionGroup, который освободит пул соединений, заставив ServicePoint создать еще один (таким образом, другой локальный ip). – Will

+0

Удивительно, я дам ему попробовать –

0

Вот быстрое решение, которое вы можете попробовать, не задумываясь о базовых библиотеках:

Поместите некоторый случайный мусор в конце вашего целевого URL, например,

http://api.address.com/restful/get?param1=a&param2=b& барахло = 13929348398

Вы можете сгенерировать GUID, случайное число, nanotime и т.д. Этот подход отлично работает для предотвращения кэширования ответов - он должен хорошо работать и в этом случае. Как вы думаете, это сработает для вас? Предполагая, что API игнорирует этот последний параметр ...

Лучше всего вместо случайного числа вы можете добавить хэш своего исходного IP-адреса, чтобы фактически использовать поведение кэширования, которое вы наблюдаете.

+0

вызовы api уже передают переменные параметры в querystring, поэтому я думаю, что соединения кэшируются изнутри только на основе url (или url и path). –

+0

, чтобы процитировать комментарий по связанному вопросу: странность в том, что он возвращает тот же ServicePoint для любого Uri, который обращается к тому же удаленному IPAddress. –

+0

Понял .. назад к чертежной доске;) – mikey

Смежные вопросы