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

Я хочу, чтобы мой запрос проходил через определенные 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-адрес (0,32) с любого из моих IP-адресов (30 или 31) Как я могу заставить его пройти через мой конкретный IP (скажем, .30). Есть ли способ сделать это с помощью WCF?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

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


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

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


1 голос
/ 06 сентября 2010

Вы пытаетесь сделать что-то похожее на 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;
    }
0 голосов
/ 26 августа 2010

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

route add 192.168.0.32 mask 255.255.255.255 192.168.175.30

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

...