Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
73
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

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

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

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

public class Service1 : IService1

{

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

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

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

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

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

То же самое проделаем для имени интерфейса (IService1). Введём новое имя ILWP16Service. И переименуем имя файла сервиса в LWP16Service:

Слегка изменим сервис. Откроем код класса интерфейса сервиса (файл ILWP16Service.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 отвечатет за то, разрешены, запрещены или требуются ли сеансы.

В файле LWP16Service.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 (Построение -> Построить решение, либо F6).

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

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

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

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

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

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

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

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

(Name)

изменим с Form1.cs3 на LWP16Main

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

Text

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

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

MaximizeBox

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

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

Icon

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

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

FormBorderStyle

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

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

Size

изменим со значений 290; 290 на 350; 200

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

ПРИМЕЧАНИЕ № 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;

Код метода LWP16Main() изменим так:

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