WCF сервис приёма сообщений
Всем доброго времени суток. На связи Алексей Гулынин. В данной статье мы напишем простой сервис приёма сообщений на WCF, и на этот сервис будем отправлять сообщения. Все полученные сообщения будут выводиться в консоль. Решение будет состоять из двух проектов: сервера и клиента.
Добавим контракт, по которому будут общаться клиент и сервер. Следующий код нужно добавить и в серверный проект и в клиентский:
// Не забываем добавить ссылку на System.ServiceModel;
using System.ServiceModel;
namespace WCF_Test
{
[ServiceContract]
interface IContract
{
[OperationContract]
void Print(string str);
}
}
Как мы видим, IContract представляет собой простой интерфейс.
Атрибут ServiceContract говорит о том, что интерфейс определяет контракт службы (сервиса) в WCF.
Атрибут OperationContract говорит о том, что метод определяет операцию, которая является частью контракта службы в WCF.
В серверный проект добавим реализацию контракта:
using System;
using WCF_Test;
namespace HelloWCF
{
class Service : IContract
{
public void Print(string str)
{
Console.WriteLine("Сервер получил сообщение: {0}", str);
}
}
}
Как мы здесь видим класс Service просто реализует метод Print() интерфейса IContract.
Класс Program.cs переименуем в Server.cs. Код будет следующим:
using HelloWCF;
using System;
using System.ServiceModel;
namespace WCF_Test
{
class Server
{
static void Main(string[] args)
{
// Адрес, на котором будет работать служба.
Uri address = new Uri("http://localhost:323/IContract");
// Привязка, т.е. транспорт, по которому будет происходить обмен сообщениями
BasicHttpBinding binding = new BasicHttpBinding();
// Контракт
Type contract = typeof(IContract);
// Создаём хост с указанием сервиса
ServiceHost serviceHost = new ServiceHost(typeof(Service));
// Добавляем конечную точку
serviceHost.AddServiceEndpoint(contract, binding, address);
// Запускаем наш хост
serviceHost.Open();
Console.WriteLine("Сервер запущен.");
Console.ReadKey();
// Закрываем наш хост после того, как будет нажата любая клавиша
serviceHost.Close();
}
}
}
Как стоит понимать адрес http://localhost:323/IContract: с помощью протокола http идём на компьютер (или узел) localhost, где на порту 323 сервис IContract готов принимать сообщения. Тип привязки должен совпадать с транспортной схемой, которую мы используем (в нашем случае http). Клиент должен использовать точно такую же привязку, как и служба.
ServiceHost — это некий контейнер, который в себе объединяет все составляющие сервиса.
С кодом сервера мы закончили. Переходим к клиентской части.
Класс Program.cs переименуем в Client.cs. Код будет следующим:
using System;
using System.ServiceModel;
using WCF_Test;
namespace Client
{
class Client
{
static void Main(string[] args)
{
Uri address = new Uri("http://localhost:323/IContract"); // Адрес
BasicHttpBinding binding = new BasicHttpBinding(); // Привязка
// Создаём конечную точку.
EndpointAddress endpoint = new EndpointAddress(address);
// Создаём фабрику каналов.
ChannelFactory<IContract> channelFactory = new ChannelFactory<IContract>(binding, endpoint);
// Создаём канал
IContract channel = channelFactory.CreateChannel();
// Отправляем сообщение
channel.Print("Send message using WCF!!!");
// После нажатия клавиши клиент завершит свою работу
Console.ReadKey();
}
}
}
Расскажу, что происходит здесь:
Для того, чтоб связаться с сервером нужен некий канал, по которому эта связь будет происходить. Этот канал создаётся следующим образом:
- Добавляем адрес сервера.
- Создаём ту же самую привязку.
- Создаём конечную точку.
- Создаём фабрику каналов, которая и будет создавать определенный канал (со своим адресом, привязкой и контрактом) для работы клиента с сервером.
Теперь всё готово к приёму сообщений. Сначала запускаем сервер, а затем клиент. Можно запускать несколько клиентов. После тестирования мы видим, что всё работает.
В данной статье вы узнали о том, как реализовать сервис приёма сообщений на WCF.




