2014-10-07 2 views
0

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

Вот упрощенная версия того, что я делаю сейчас:

using (HttpClient client = new HttpClient()) 
    using (HttpResponseMessage response = await client.SendAsync(request)) 
    if (response.IsSuccessStatusCode) 
     result = await response.Content.ReadAsStringAsync(); 

Я не привязан к System.Net.Http.HttpClient, и я полностью открыт для использования других классов, как System.Net.HttpWebRequest, чтобы получить работу.

Это возможно, по крайней мере, теоретически, поскольку Windows и System.Net.Sockets допускают это с помощью метода Bind. Source IP address selection on a Multi-Homed Windows Computer, MSDN - Socket Class (System.Net.Sockets)

Очевидно, что это невозможно, но в идеальном мире, я мог какой-то образом получить доступ к основному гнезду так:

client.Socket.Bind(new IPEndPoint(167772161, 80)); 

Есть ли способ сделать это без написания всего клиента HTTP ?


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

Вот упрощенная версия:

  1. машина 1
    1. приложение 1 (10.0.1.10/255.255.0.0)
    2. App 2 (10.0.1.11/255.255.0.0)
    3. и т.д ..
  2. машина 2
    1. приложение 1 (10.0.2.10/255.255.0.0)
    2. App 2 (10.0.2.11/255.255.0.0)
    3. и т.д. ...
  3. и т.д. ...

Трафик маршрутизируется с 172.16.0.2 (приложение 1 внешнее) до 10.0.x.10 (1 приложение 1), от 172.16.0.3 (приложение 2 внешнего) до 10.0.x.11 (приложение 2 внутри) и т. Д. Мы пытаясь избежать внешних запросов из приложения 2, используя 172.16.0.2 (приложение 1 external), поскольку оно использует 10.0.x.10 в качестве локального адреса вместо 10.0.x.11.

Быстрая сетевая схема упрощенного примера, в случае, который помогает на всех: example network diagram

+0

Ваш вопрос не совсем ясен. Вы делаете HTTP-запрос на какой-то URL-адрес: у этого URL-адреса уже есть IP-адрес. Я не совсем понимаю, где должны быть серверы и клиенты. Кроме того, как у вас может быть один сетевой адаптер с множеством разных IP-адресов? – Luaan

+0

Это IP-адрес назначения. Я пытаюсь изменить исходный IP-адрес. Вы можете добавить больше IP-адресов в расширенные настройки TCP/IP вашего сетевого адаптера. –

+0

Я на 100% уверен, что у меня несколько IP-адресов. Вот вопрос, который объясняет, как вы можете это сделать, если вам интересно: http://serverfault.com/questions/868/multiple-ip-addresses-per-nic –

ответ

1

HttpClient не позволяет сделать это. Однако, HttpWebRequest делает!

A HttpWebRequest может быть связан с объектом ServicePoint, который управляет соединениями HTTP. Это позволяет вам передать IPEndPoint, который у вас есть.Простой пример:

var req = HttpWebRequest.CreateHttp("http://www.google.com/"); 

req.ServicePoint.BindIPEndPointDelegate = 
    (s, ep, retries) => 
    new IPEndPoint(IPAddress.Parse("10.0.1.10"), 1234 + retries); 

var response = req.GetResponse(); 

Обратите внимание, что порт не80 - причина я добавил retries к номеру порта, потому что каждый сокет клиент должен иметь уникальный номер порта.

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

+0

Спасибо! ServicePoint.BindIPEndPointDelegate выглядит именно так, что мне нужно, чтобы это работало. –

+1

вы можете использовать порт no '0', который автоматически выбирает свободный локальный порт. –

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