Задача: Организовать работу WCF-службы и клиентского приложения через локальную сеть.
Все предыдущие статьи этого цикла были связаны с разработкой приложений, предназначенных для работы в рамках одного компьютера, однако средства WCF предназначены, в первую очередь, для создания сетевых приложений.
Каким образом преобразовать разработанные нами ранее программы в сетевые?
Ответ прост: изменить настройки приложений через файл "App.config".
- Необходимо решить, какая привязка будет обеспечивать наше соединение. Следует учитывать, что некоторые привязки предназначены только для работы между процессами одной операционной системы, некоторые привязки не поддерживают дуплексные коммуникации, а некоторые привязки предназначены исключительно для технологии WCF или операционных систем класса Windows. Выбор конкретной привязки зависит от требований и условий подключения. Самой простой, но и наиболее поддерживаемой другими программами являются привязки для работы через протоколы HTTP и HTTPS, то есть "BasicHttpBinding" и др. "*HttpBinding": их следует рекомендовать, когда программист одной стороны не уверен в коммуникационных возможностях другой стороны.
- Пропишите эту привязку в настройках конечных точек клиента и сервера.
- Для привязки необходимо сформировать соответствующий адрес конечной точки: относительный, с учетом базового адреса службы, или абсолютный. Например, для "HTTP"-привязок базовый адрес службы и абсолютный адрес точки должен быть вида "http://[адрес_компьютера]/[путь_до_службы]".
Согласованный ввод одинакового адреса для службы и клиента при поддержке одинаковых контрактов гарантирует возможность установления соединения.
Предположим, что служба будет запущена на компьютере с IP-адресом: "10.1.34.1". Пусть привязка будет "BasicHttpBinding". Тогда пусть служба прослушивает подключения по адресу: "http://10.1.34.1/service".
Тогда настройки клиента из статьи Основы разработки WCF-служб. Часть 4. Клиент для службы могут выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint address="http://10.1.34.1/service" binding="basicHttpBinding" contract="WorkBookRef.IWorkBook" name="WSHttpBinding_IWorkBook"> </endpoint> </client> </system.serviceModel> </configuration> |
А настройки службы (с учетом модификаций статьи Основы разработки WCF-служб. Часть 8. Публикация метаданных):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="NewBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/bookservice/meta"/> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="NewBehavior" name="b_FirstService.WorkBook"> <clear /> <endpoint address="http://10.1.34.1/service" binding="basicHttpBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="advanced" binding="ws2007HttpBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="net.tcp://localhost:9000/bookservice" binding="netTcpBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="net.pipe://localhost/bookservice" binding="netNamedPipeBinding" contract="b_FirstService.IWorkBook" listenUriMode="Explicit"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://localhost:8080/bookservice" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration> |
Хотя, конечно, остальные конечные точки в службе для нашего клиента здесь не нужны.
Следует отметить, что локальная сеть одного предприятия – это не предел. Служба может быть расположена где угодно в интернете, и адрес ее может быть не "http://10.1.34.1/service", а, например, "http://ya.ru/service". Правда, тогда выбор привязок ограничивается исключительно "HTTP"-привязками.