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.