Решил вспомить 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();
}
}
}
В итоге получилось простейшее клиент-серверное
Читать далее...