Модификация приложения WCF : приложение-клиент для WCF -службы



 

Для начала изменим имя сервиса. Выделим файл Service 1. svc в обозревателе решений и перейдём к его коду (правая кнопка мыши -> Перейти к коду либо F 7). Код файла содержит классы для работы с параметрами сервиса, теми самыми, что были доступны в клиенте WCF. Найдём в коде строку:

 

// ПРИМЕЧАНИЕ. Команду "Переименовать" в меню "Рефакторинг" можно использовать для одновременного изменения имени класса "Service1" в коде, SVC-файле и файле конфигурации.

public class Service1 : IService1

{

 

Выделим имя класса (слово) Service 1 и далее ПКМ -> во всплывающем меню: Рефакторинг -> Переименовать (или F 2):

 

Рис. 3. 1. Переименование сервиса

 

Вводим в открывшемся окне имя LWP 16 Service, жмём ОК, в следующем окне Применить:

 

Рис. 3. 2. Переименование сервиса: Переименовать

 

Рис. 3. 2. Переименование сервиса: Просмотр изменений - Переименование

 

То же самое проделаем для имени интерфейса (IService 1). Введём новое имя ILWP 16 Service. И переименуем имя файла сервиса в LWP 16 Service:

 

Слегка изменим сервис. Откроем код класса интерфейса сервиса (файл ILWP 16 Service . cs) и найдём:

 

   [OperationContract]

   string GetData(int value);

 

Изменим так:

 

   [OperationContract]

   string GetInt(int value);

 

   [OperationContract]

   string GetString(string value);

 

Обратим внимание на атрибуты [ OperationContract ] в приведенном выше коде. Эти атрибуты обязательны для любого метода, предоставляемого службой. Параметры которым обладает «контракт»:

 

IsInitiating – если true тогда связь с сервисом и сессия начинается, создается объект реализации на сервисе и запускается его конструктор. IsOneWay – если true данный метод ничего не возвращает и только в одну сторону. IsTerminating – значение true этого параметра приводит к тому, что по окончанию его обработки на сервисе связь с клиентом прерывается и сессия закрывается, т.е. последующие обращения к сервису приведут к ошибкам. Выглядит это так:

 

   [OperationContract(IsInitiating = true, IsOneWay = false, IsTerminating = false)]

 

Для [ServiceContract]:

 

[ServiceContract(SessionMode = SessionMode.Required)]

 

Параметр SessionMode отвечатет за то, разрешены, запрещены или требуются ли сеансы.

 

В файле LWP 16 Service . svc . cs найдём:

 

public class LWP16Service : ILWP16Service

{

   public string GetData(int value)

   {

       return string.Format("You entered: {0}", value);

   }

 

Заменим на:

 

   public string GetInt(int value)

   {

       return string.Format("Вы ввели число: {0}", value);

   }

 

   public string GetString(string value)

   {

       return string.Format("Вы ввели строку: {0}", value);

   }

 

Сервис можно компилировать по конфигурации Release (Построение -> Построить решение, либо F 6).

 

Осталось добавить клиентское приложение. Интегрируем такое приложение непосредственно в текущее решение. Для этого выполним следующие действия: Файл -> Создать -> Проект. В окне открывшемся окне «Создать проект», в поле Решение, выберем: Добавить в решение. В качестве проекта выберем Приложение Windows Forms. Имя будет: LWP 16 WCFClient. Жмём ОК. Получим следующее:

 

Рис. 3. 3. Обозреватель решений: содержимое решения, состоящего из двух проектов

 

Теперь интегрируем службу LWP 16 Service . svc в форму. Для этого в обозревателе решений выделим имя проекта (LWP 16 WCFClient), далее жмём правую кнопку мыши -> Добавить ссылку на службу...:

 

В открывшемся окне жмём на Найти, далее Службы решения. Наша служба автоматически добавится в список. В поле Пространство имён вводим: LWP16ServiceReference:

 

Рис. 3. 4. Добавить ссылку на службу: добавление службы из нашего решения в другой проект этого же решения

 

Жмём ОК. И откроем конструктор формы клиентского проекта2.

 

ПРИМЕЧАНИЕ № 2: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы ( ) или выбрать вкладку на панели вкладок с именем <имя формы>. cs [Конструктор].

 

На форме клиентского проекта Form 1  расставим два текстовых поля, под ними одну кнопку и ещё ниже два статических поля Label. Все имена и свойства добавленных элементов оставим без изменений. Задаём следующие параметры самой формы на панели Свойства:

 

( Name ) изменим с Form 1. cs 3 на LWP 16 Main

^ Поменяем внутреннее имя формы.

Text изменим с Form 1 на Клиент для службы WCF ( C #)

^ Поменяем заголовок формы (то, что отображается в шапке приложения слева).

MaximizeBox изменим с True на False

^ Уберём кнопку Развернуть.

Icon изменим изображение (иконку) приложения

^ Необходим файл значка *. ico.

FormBorderStyle > изменим с Sizable на FixedDialog

^ Сделаем окно «неизменяем» по размерам.

Size изменим со значений 290; 290 на 35 0; 2 00

^ Поменяем размер формы.

 

ПРИМЕЧАНИЕ № 3: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значок формы ( ) и нажать правую кнопку мыши, затем выбрать Переименовать. Ввести необходимое новое имя СОХРАНЯЯ расширение *. cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:

 

Форма будет выглядеть примерно так:

 

Рис. 3. 5. Модифицированная форма приложения и расстановка необходимых элементов управления

 

Кнопку и текстовые поля TextBox растянем до границ формы.

 

Дважды щёлкнем по кнопке на форме, тем самым создав событие Click. Впишем код:

 

   private void button1_Click(object sender, EventArgs e)

   {

       if (textBox1.Text == "Ведите число") { textBox1.Text = "0"; }

       LWP16ServiceReference.LWP16ServiceClient client = new LWP16ServiceReference.LWP16ServiceClient(); // Открываем сеанс связи со службой

 

       returnString1 = client.GetInt(Convert.ToInt32(textBox1.Text));

       label1.Text = returnString1;

       returnString2 = client.GetString(textBox2.Text);

       label2.Text = returnString2;

       client.Close(); // Закрываем сеанс связи

   }

 

В этом же файле найдём:

 

public partial class LWP16Main : Form

{

 

Вставим после:

 

   String returnString1;

   String returnString2;

 

Код метода LWP 16 Main () изменим так:

 

   public LWP16Main()

   {

       InitializeComponent();

       label1.Text = "";

      label2.Text = "";

       textBox1.Text = "Ведите число";

       textBox2.Text = "Введите строку";

       button1.Text = "Связать со службой";

   }

 

И для первого (верхнего) TextBox объявим событие KeyPress, в котором запретим вводить все символы кроме цифр. Если этого не сделать, поймаем исключение. Служба на это поле будет передавать данные из метода GetInt (), который в качестве параметра принимает только int. Можно обойтись и без события для TextBox, тогда исключение можно обработать try - catch блоком. Код события:

 

   private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

   {

       // Введённые символы должны быть только цифрами, иначе ввода не будет (символ не введётся)

       if (!Char.IsDigit(e.KeyChar))

       {

           e.Handled = true;

       }

   }

 

Сделаем нашу форму автоматически запускаемой при компиляции. Откроем свойства решения ( ) и в поле Запускаемый проект выберем LWP16WCFClient:

 

Компилируем приложение (Release) и запускаем. Откроется форма клиента. Вводим в первое поле цифры, во второе какую-нибудь строку и жмём на кнопку Связаться со службой. Получаем ответ в виде двух статических строк внизу формы:

 

Рис. 3. 6. Модифицированное приложение Windows Forms: работа клиента для службы WCF

 


Дата добавления: 2019-09-13; просмотров: 201; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!