Как привязать Http-клиент WCF к определенному исходящему IP-адресу перед выполнением запроса

Я хочу, чтобы мой запрос выходил через определенные IP-адреса. Есть ли способ сделать это в WCF. Объяснение того, зачем мне это нужно, немного затянуто, поэтому я бы не хотел вдаваться в это.

Вот пример кода

string ipAddress = "192.168.0.32";
IService service;
ChannelFactory<IOmlService> factory = new ChannelFactory<IService>(new BasicHttpBinding(), new EndpointAddress("http://" + IPAddress + ":6996/IService"));
service = factory.CreateChannel();
service.Test();

Вот пример сценария, чтобы объяснить, что именно я ищу. Допустим, у меня на машине два IP-адреса (192.168.0.30 и 192.168.0.31). Оба они могут попасть на 192.168.0.32. Если я запущу этот код сейчас, он попадет на IP-адрес (.32) с любого из моих IP-адресов (.30 или .31). Как я могу заставить его пройти через определенный мой IP (скажем, .30). Есть ли способ сделать это с помощью WCF?


person Mark    schedule 26.08.2010    source источник


Ответы (3)


Ответ на вопрос заключается в том, что это невозможно сделать. Вот ответ от Microsoft MVP


Итак, вы хотите, чтобы клиентская машина активно выбирала один из интерфейсов сетевых адаптеров (установленных на нем) для отправки запросов WCF? Я боюсь, что это выходит из-под контроля WCF, поскольку WCF фокусируется только на следующих адресах:

** при работе в качестве хоста мы можем выбрать привязку к определенному имени/адресу хоста для прослушивания клиентских запросов ** при работе в качестве клиента мы можем выбрать адрес/имя хоста назначения для отправки запроса.


person Mark    schedule 15.09.2010
comment
Если это невозможно сделать, и кто-то открывает запрос функции, я буду голосовать за указанную функцию. - person Justin Dearing; 15.09.2010
comment
После всех этих лет его все еще нет? - person Furkan Omay; 17.10.2014

Вы пытаетесь сделать что-то похожее на IP-Sec на сервере, чтобы он принимал запросы только с определенных IP-адресов?

В этом случае вам нужно реализовать IEndpointBehavior и IDispatchMessageInspector и:

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        RemoteEndpointMessageProperty remoteAddress =
            (OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as
             RemoteEndpointMessageProperty);

        // validate ip here
        return null;
    }
person Aliostad    schedule 06.09.2010

Мне кажется, что вашу проблему надо решать установкой дополнительной руты в таблице маршрутизации. Попробуйте сделать следующее из командной строки, запущенной с правами администратора:

route add 192.168.0.32 mask 255.255.255.255 192.168.175.30

Если вы хотите сохранить маршрут, добавьте ключ -p дополнительно.

person Oleg    schedule 26.08.2010
comment
Я больше пытаюсь найти, как привязать клиент WCF к определенному исходящему IP-адресу в WCF. Как бы я явно связать его. Кроме того, я не могу работать с административными привилегиями. Кроме того, это приложение будет использоваться на многих машинах, и я не уверен, имеет ли смысл программно играть с таблицей маршрутизации каждый раз, когда я хочу делать эти запросы. - person Mark; 27.08.2010
comment
В общем случае можно определить привязку к конкретному адресу только для серверного приложения. Тогда IP сервера будет известен. Клиент просто подключается к этому IP, используя таблицу маршрутизации. Таблица маршрутизации определяет, через какой интерфейс можно архивировать IP-адрес. По крайней мере, метрика интерфейса говорит об этом. Поэтому, если у вас есть такие экзотические IP-адреса в вашем IP-сегменте, администратор может один раз (route -p ...) определить, как должен быть получен IP-адрес назначения. Эта информация будет постоянной и не изменится после перезагрузки или входа другого пользователя. - person Oleg; 27.08.2010
comment
Это правда, что обычно привязку определяют только для сервера. Но, например, для сокетов вы можете определить привязку для клиента. Мой вопрос в том, что это можно сделать из WCF. Это вопрос WCF. - person Mark; 27.08.2010
comment
У меня нет большого опыта работы с сокетами, но я всегда использовал bind до listen на стороне сервера. На стороне клиента я использовал только connect с sockaddr_in, инициализированным только информацией о сервере. Вызов bind на стороне клиента не требуется (см. также msdn.microsoft.com /en-us/library/ms737548.aspx). Поэтому я следовал за сокетами так же, как описано ранее с WCF. - person Oleg; 27.08.2010
comment
Привязка не требуется, но привязка должна быть возможной. Я хочу связать. Вопрос не в том, следует связывать или нет. Не вопрос и в том, можно ли сделать то же самое другим способом. Вопрос в том, как мы можем выполнить привязку на стороне клиента в WCF? - person Mark; 27.08.2010
comment
Я объяснил вам, что, в моем понимании, привязка на стороне клиента НЕВОЗМОЖНА ни при каких технологиях, включая WCF и Sockets. Если вы найдете ссылку на какую-либо технику, как это сделать, пришлите мне соответствующий URL ссылки. - person Oleg; 27.08.2010