WCF сервис приёма сообщений

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();
    }
  }
}

Расскажу, что происходит здесь:

Для того, чтоб связаться с сервером нужен некий канал, по которому эта связь будет происходить. Этот канал создаётся следующим образом:

  1. Добавляем адрес сервера.
  2. Создаём ту же самую привязку.
  3. Создаём конечную точку.
  4. Создаём фабрику каналов, которая и будет создавать определенный канал (со своим адресом, привязкой и контрактом) для работы клиента с сервером.

Теперь всё готово к приёму сообщений. Сначала запускаем сервер, а затем клиент. Можно запускать несколько клиентов. После тестирования мы видим, что всё работает.

В данной статье вы узнали о том, как реализовать сервис приёма сообщений на WCF.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *