Решил вспомить WCF .NET. Перерыл пол инета все примеры через конфиг файл приложения. Это удобно но недостаточно гибко. Тем более что в крупном проектк придется делать полностью руками, не пологаясь на самогенерируемый код...

Не нашел, но есть же MSDN. Там пример сервер-клиент приложения - калькулятора. Клиент автогенерируемый. =(

Ну при построение клиент-серверного приложения в первую очередь важен сервер! Посему начал с сервера а клиент на сладкое.
Для начала необходимо реализовать контракт клиент-серверных взаимоотношений. Я решил для теста написать клиент серверное приложение передающее командную строку по числовому запросу.

Допустим:
1 - Старт
0 - Стоп
2-... - Какая-то команда

Перейдем к реализации сервиса.
Вначале реализуется интерфейс к которому будет иметь доступ клиент и сервер.

code:

using System.ServiceModel; namespace CommunicationInterface { [ServiceContract] // Говорим WCF что это интерфейс для запросов сервису public interface IMyObject { [OperationContract] // Делегируемый метод. string GetCommandString(int i); } }

Соответственно на сервере должна быть его реализация.

code:

namespace CommunicationInterface { public class MyObject: IMyObject { public string GetCommandString(int i) { switch (i) { case 1: return "Start command"; case 0: return "Stop command"; default: return "Command " + i.ToString(); } } } }

Теперь перейдем к основной части: реализация сервера.
В данном примере сервер будет консольным приложением.
Начнем с того что объясним WCF какой объект будет отвечать за функционал сервера и по какому адресу\протоколу будет происходить обращение. Для начала возьмем http Создаем хост по адресу "http://localhost:1050/TestService" и говорим WCF что при получение запроса для его обработки надо создать экзэмпляр сервис-класса "MyObject"

ServiceHost host = new ServiceHost(typeof(MyObject), new Uri("http://localhost:1050/TestService"));

Теперь надо объяснить WCF что запрос http и какой интерфейс предоставляется клиенту по запросу.

host.AddServiceEndpoint(typeof(IMyObject), new BasicHttpBinding(), "");


code:

using System; using System.ServiceModel; using CommunicationInterface; namespace Server { class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(MyObject), new Uri("http://localhost:1050/TestService")); host.AddServiceEndpoint(typeof(IMyObject), new BasicHttpBinding(), ""); host.Open(); Console.WriteLine("Start service..."); Console.ReadLine(); host.Close(); } } }

Теперь клиент. MSDN предлагает средствами специальной утилы обратиться к сервису, опросить его функционал и автоматически сгенерировать интерфейс доступа. Код как обычно в таких случиях получается грамоздкий, да и реально не очень удобный...
Потом если делать приложение c возможностями callback то этот вариант вообще не приемлем... В итоге клиент реализуем руками.
Начнем с того что зададим адрес где висит сервис:

Uri tcpUri = new Uri("http://localhost:1050/TestService");
EndpointAddress address = new EndpointAddress(tcpUri);

Далее надо создать канал для доступа к экземпляру сервиса. Не забываем указать что используется http


ChannelFactory factory = new ChannelFactory(new BasicHttpBinding(), address);

Открываем канал и получаем доступ через наш интерфей к экземпляру созданному на сервер.

IMyObject service = factory.CreateChannel();

Таким образом получаем клиент:

code:

using System; using System.ServiceModel; namespace Client { [ServiceContract] public interface IMyObject { [OperationContract] string GetCommandString(int i); } class Program { static void Main(string[] args) { Uri tcpUri = new Uri("http://localhost:1050/TestService"); EndpointAddress address = new EndpointAddress(tcpUri); BasicHttpBinding binding = new BasicHttpBinding(); ChannelFactory factory = new ChannelFactory(binding, address); IMyObject service = factory.CreateChannel(); Console.WriteLine("Call service method..."); Console.WriteLine(service.GetCommandString(1)); Console.WriteLine(service.GetCommandString(2)); Console.WriteLine(service.GetCommandString(0)); Console.ReadLine(); } } }

В итоге получилось простейшее клиент-серверное приложение.

 (699x437, 34Kb)

  • Без заголовка 1063

  • Ваш комментарий


    Вы должны войти в систему, чтобы оставить комментарий.