Windows Communication Foundation – створення сервісу

Доброго вечора, сьогодні я розповім, як можна використовуючи засоби .NET Framework обмінюватись інформацією по мережі.

Часто при створенні програмних продуктів, які можуть використовуватись на підприємствах, навчальних закладах, магазинах і т.д. потрібно створити якесь централізоване джерело для зберігання та отримання даних. Звичайно ми можемо звертатись на пряму до бази даних, але створивши сервіс, який буде отримувати та передавати ці дані, ми отримаємо додатковий рівень в нашій системі, що зробить її більш гнучкою (наприклад при створенні кількох джерел зберігання даних).

На даний момент для створення такого сервісу в нас є технологія Windows Communication Foundation, яка витіснила попередній .NET Remoting більшою гнучкістю, функціональністю, і яка дозволяє реалізувати вище запропоновану ідею.

Створення сервісу

Першим кроком в створенні сервісу є створення контракту – інтерфейсу, який буде описувати функціональність сервісу (сигнатури методів).

Для прикладу самий простий інтерфейс для передачі повідомлення може бути таким:

public interface IMessageReciever
{
    void SendMessage(String message);
}

Маючи тільки інтерфейс, ми не можемо отримати ніякої функціональності, для того щоб відправка повідомлення працювала, нам потрібно створити клас, який цей інтерфейс реалізує.

Першим кроком створіть проект вибираючи в меню <strong>File-New Project->WCF->WCF Service Library</strong>

<strong><a href=”https://sergiyshumakov.files.wordpress.com/2011/02/clip_image0026.jpg”><img style=”background-image: none; padding-left: 0; padding-right: 0; display: inline; padding-top: 0; border-width: 0; margin: 0;” title=”clip_image002[6]” src=”https://sergiyshumakov.files.wordpress.com/2011/02/clip_image0026_thumb.jpg&#8221; alt=”clip_image002[6]” width=”244″ height=”170″ border=”0″ /></a></strong>

Використовуючи цей шаблон проекту, в вас з’явиться вже файл IService1.cs, в якому є написаний певний код:

// NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in App.config.
[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
    ..
}

Як ви бачите, ось тут і описується контракт, про який я вам розповідав. Різниця полягає в тому, що тепер інтерфейс позначений атрибутом “ServiceContract”, а методи, які знаходяться в даному інтерфейсі позначені атрибутом “OperationContract”. Ці атрибути є обов’язковими, тому при додаванні додаткових методів в цей інтерфейс, вам потрібно буде їх позначити атрибутом “OperationContract”.

Тепер в цей інтерфейс добавте попередній метод та позначте його необхідним атрибутом:

// NOTE: If you change the interface name “IService1” here, you must also update the reference to “IService1” in App.config.

[ServiceContract]
public interface IService1
{
    [OperationContract]
    void SendMessage(String message);
    [OperationContract]
    string GetData(int value);
…
}

Наступним кроком відкрийте файл Service1.cs, в якому знаходиться клас, який реалізує попередній інтерфейс:

// NOTE: If you change the class name “Service1” here, you must also update the reference to “Service1” in App.config.

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
..
}

Спробувавши скомпілювати проект, ви отримаєте помилку, яка виникне через те, що клас Service1, який реалізує інтерфейс IService1 не реалізує його метода SendMessage. Модифікуйте код наступним чином:

// NOTE: If you change the class name “Service1” here, you must also update the reference to “Service1” in App.config.

public class Service1 : IService1
{
    public string GetData(int value)
    {
         return string.Format("You entered: {0}", value);
    }
    public void SendMessage(string message)
    {
         Console.WriteLine("Message has recieved: {0}", message);
    }
..
}

Тепер можна запускати компіляцію, після запуску автоматично запускається утиліта WCF Service Host та WCF Test Client, за допомогою якої ми можемо спробувати чи працює наш сервіс як потрібно.clip_image004[4]

Ввівши необхідні параметри та натиснувши кнопку Invoke, ви запустите вибраний метод.

Створення хоста

Так як це тестова утиліта, то вам скоріше всього потрібно буде створити свій виконавчий файл, який зможе хостити наш сервіс. Для того, щоб це зробити, нам потрібно створити хост сервера, тому зробіть наступні кроки:

1. File->Add->New Project..->Windows Console Application.

В наше рішення добавився ще один проект, який при старті буде запускати наш сервіс.

Перш за все нам потрібно добавити посиланя (референт) на збірку System.ServiceModel.dll, для цього в контекстному меню на закладці References виберіть Add Reference.. -> System.ServiceModel.dll -> OK

clip_image006[4]

clip_image008[4]

clip_image010[4]

Коли ми маємо посилання на цю збірку, нам потрібно використати клас ServiceHost, який знаходиться в просторі імен System.ServiceModel. Отже до директив using добавте таку:

using System.ServiceModel;

2. Потрібно добавити посилання на збірку, в якій знаходиться тип, який реалізує потрібний нам контракт, що в нашому випадку є WCFService.dll, тому потрібно зробити наступне:

в контекстному меню на закладці References виберіть Add Reference..-> Projects -> WCFService->OK

clip_image012[4]

3. Перетягнути App.Config файл з с проекту WCFService в проект Host.clip_image014[4]

4. Виключити автоматичний запуск утиліти для тестування, на закладці властивостей проекту WCFService->WCF Options->Start WCF Service Host…

clip_image016[4]

5. Зробити проект Host стартовим, вибравши в контекстному меню на проекті Host вкладку Set as StartUp Project.

На даний момент ми маємо все потрібне для створення та хоста, отже потрібно створити екземпляр класу ServiceHost написавши такий текст в методі main:

static void Main(string[] args)
{
    ServiceHost host = new ServiceHost(typeof(Service1));
    host.Open();
    Console.ReadLine();
}

Отже якщо все запустилось добре, в вас не буде ніяких виняткових ситуацій.

Створення клієнта

Якщо в нас є сервер, який може приймати повідомлення, то потрібно звичвайно зробити клієнт, який ці повідомлення буде надсилати. Для того щоб створити клієнта, добавте в наш solution ще один проект –

File->Add->New Project->Console Application. Створивши консольну програму, нам потрібно згенерувати проксі клас, за допомогою якого ми зможемо використовувати функціональність сервісу з відчуттям, що ми працюємо з локальним об’єктом, а значить використовуючи IntelliSense, що дуже пришвидшує нашу розробку. На щастя в Visual Studio процес створення проксі (клієнта) автоматизований і не забере в вас багато зусиль. Для того щоб його створити зробіть наступне:

1. Включити автоматичний запуск утиліти для тестування, на закладці властивостей проекту WCFService->WCF Options->Start WCF Service Host…

2. На проекті Client викличіть контестне меню та виберіть Add Service Reference

3. В полі для введення посилання на сервіс, якщо ви в App.config файлі не міняли адресу, яка була згенерована автоматично, то введіть http://localhost:8731/Design_Time_Addresses/WcfService/Service1/ і натисніть Go

4. На даному етапі, якщо ваш сервіс був успішно запущений утилітою WCF Service Host побачите наступний інтерфейс:

clip_image018[4]

Якщо натиснути OK, почнеться генерування клієнта і в проекті з’явиться така річ:

clip_image020[4]

Тестування клієнта

В проекті Client, файлі Program.cs ми допишемо такий код:

static void Main(string[] args)
{
    ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
    client.SendMessage("Hello from client");
}

Встановимо проект Client стартовим:

clip_image022[4]

Запустимо вручну консольну програму Host.exe і тепер ми маємо все для використання клінта J!

Запустивши клієнта, в програмі-хості ми отримаємо таке повідомлення, яке виведеться на екран:

clip_image024[4]

Впевнений, що даний приклад допоможе вам при майбутньому використанні Windows Communication Foundation, особливо коли вам потрібно буде програму, яка буде комунікувати з сервером. Дякую за відвідування мого блогу, всього найкращого!

Advertisements

, , ,

  1. Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: