2010-08-26 4 views
4

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

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

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-адрес моего (скажем 0,30). Есть ли способ сделать это с помощью WCF?

ответ

2

Ответ на этот вопрос в том, что она не может быть сделано. Вот ответ от Microsoft MVP


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

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


+0

Если это невозможно, и кто-то откроет запрос функции, я проголосую за указанную функцию. –

+0

После всех этих лет он все еще отсутствует? –

0

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

route add 192.168.0.32 mask 255.255.255.255 192.168.175.30 

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

+0

Я больше пытаюсь найти, как привязать клиента WCF к определенному исходящему IP в WCF. Как бы я явно привязал его. Кроме того, я не могу работать с административными правами. Кроме того, это приложение, которое будет использоваться на многих машинах, я не уверен, имеет ли смысл программно играть с таблицей маршрутизации каждый раз, когда я хочу сделать эти запросы. – Mark

+0

Обычно определяют привязку к конкретному адресу ** только для приложения сервера **. Тогда будет известен IP-адрес сервера. Клиент просто устанавливает соединение с этим IP-адресом, используя таблицу маршрутизации. Таблица маршрутизации определяет, через какой интерфейс можно архивировать IP-адрес. По крайней мере, метрика интерфейса говорит об этом. Поэтому, если у вас есть такие экзотические IP-адреса на вашем IP-сегменте, администратор может определить один раз («route -p ...»), как должен быть назначен IP-адрес назначения. Эта информация будет постоянной и не будет изменена после перезагрузки или входа в систему другого пользователя. – Oleg

+0

Это правда, что в общем случае определяется привязка только для сервера. Но, например, для сокетов можно определить привязку для Клиента. Мой вопрос: возможно ли это сделать из WCF. Это вопрос WCF. – Mark

1

Вы пытаетесь сделать что-то похожее на 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; 
    }