none
Динамическое подключение клиента к WCF-службе. RRS feed

  • Вопрос

  • Всем добрый вечер!

     

    Есть следующая задача:

    Есть приложение. Есть WCF-сервис.

    WCF-сервис функционирует нормально. Через WCF Test Client все методы нормально вызываются и возвращают ожидаемые данные.

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

    Как добавлять WCF-службу в проект, все понятно и легко. Но вот как динамически во время работы программы подключиться к WCF-службе, в инете инфы так и не нашел. =(

     

    Прошу помощи!

    Буду благодарен за любую информацию!


    E-mail: Svatoslav.Pankratov@gmail.com
    27 октября 2010 г. 14:52

Ответы

  • Если используешь стандартного клиента, сгенеренного студией через Add Reference, то два варианта на выбор:

    Создать клиента с указанием binding и endpoint address в конфиге:

    HelloWorld.HelloWorldClient hello = new HelloWorld.HelloWorldClient(
     "BasicHttpBinding_IHelloWorld", new EndpointAddress("http://localhost:8888/BasicHost/HelloWorld"));
    

    Поменять адрес уже после создания:

    HelloWorld.HelloWorldClient client = new WCFHelloWorldClient.HelloWorld.HelloWorldClient();
    
    client.Endpoint.Address = new EndpointAddress("http://localhost:8899/BasicHost/HelloWorld");
    
    

     

    • Помечено в качестве ответа Svyatoslav Pankratov 27 октября 2010 г. 20:24
    27 октября 2010 г. 16:08

Все ответы

  • Если используешь стандартного клиента, сгенеренного студией через Add Reference, то два варианта на выбор:

    Создать клиента с указанием binding и endpoint address в конфиге:

    HelloWorld.HelloWorldClient hello = new HelloWorld.HelloWorldClient(
     "BasicHttpBinding_IHelloWorld", new EndpointAddress("http://localhost:8888/BasicHost/HelloWorld"));
    

    Поменять адрес уже после создания:

    HelloWorld.HelloWorldClient client = new WCFHelloWorldClient.HelloWorld.HelloWorldClient();
    
    client.Endpoint.Address = new EndpointAddress("http://localhost:8899/BasicHost/HelloWorld");
    
    

     

    • Помечено в качестве ответа Svyatoslav Pankratov 27 октября 2010 г. 20:24
    27 октября 2010 г. 16:08
  • А возможно ли как-то произвести подключение, имея только адрес WCF-службы и реализуемый этой службой интерфейс? Без генерирования клиента студией. Те как самому написать клиента ручками? Готового кода генерируется столько, что разбор полетов становится довольно сложным.

    Пока нашел инфу про такую утилиту:
    ServiceModel Metadata Utility Tool (Svcutil.exe)
    Она может по адресу WCF-службы сгенерировать клиента и конфигурационный файл.


    E-mail: Svatoslav.Pankratov@gmail.com
    27 октября 2010 г. 16:16
  • Студия при операции AddReference как раз этот svcutil.exe и использует.
    Писать клиента с нуля ручками – не слишком приятное занятие. Если есть желание понять как WCF работает изнутри – пройдись по разделу Windows Communication Foundation в MSDN. В оглавлении есть Учебник и Базовое программирование, там довольно доступно рассказано как создать сервис и клиент почти с нуля.
    27 октября 2010 г. 19:43
  • Просто вот как с нуля WCF-сервис написать и запустить его на хосте все просто и легко. А вот с клиентом что-то слишком много проблем, если с нуля и ручками сам хочешь...

    Большое спасибо за помощь, Паша! =)


    E-mail: Svatoslav.Pankratov@gmail.com
    27 октября 2010 г. 20:24
  • Не понимаю в чем проблема добавления ServiceReference в клиентский проект, однако, WCF позволяет вызывать методы сервиса и без генерации проксиков. см. тут http://msdn.microsoft.com/en-us/library/ms788970.aspx

    28 октября 2010 г. 5:41
  • О =) Кажется это как раз то что надо! Спасибо, буду изучать =)
    E-mail: Svatoslav.Pankratov@gmail.com
    28 октября 2010 г. 11:58