
- •ВВЕДЕНИЕ
- •1. АРХИТЕКТУРА ПРИЛОЖЕНИЙ WCF
- •1.1. Основы WCF
- •1.2. Конечные точки
- •1.3. Контракты
- •1.4. Атрибуты
- •2. РАЗРАБОТКА WCF ПРИЛОЖЕНИЯ
- •2.1. Создание проекта
- •2.2. Создание контракта
- •2.3. Реализация службы
- •2.4. Приложение службы
- •2.5. Конфигурация службы
- •2.6. Получение WSDL сервиса
- •2.7. Приложение клиента
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
17
public void join()
{
count++;
IClientCallback callback = OperationContext.Current. GetCallbackChannel<IClientCallback>();
User u = new User(callback); users.Add(u);
user = u;
foreach (User x in users) x.callback.count(count);
}
public void leave()
{
count--; users.Remove(user);
foreach (User x in users) x.callback.count(count);
}
private string bytes2string(byte[] data)
{
StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++)
sBuilder.Append(data[i].ToString("x2"));
return sBuilder.ToString();
}
}
}
2.4. Приложение службы
Теперь, когда контракт и его реализация полностью написаны, можно переходить к написанию приложения службы (файл Program.cs). В нашем случае это будет просто консольное приложение, запуск которого запускает службу по адре-
су http://localhost:8080/.
using System;
18
using System.Text;
using System.ServiceModel; using CryptService;
using System.ServiceModel.Description;
namespace ConsoleHost
{
class Program
{
const string URI = "http://localhost:8080/"; static void Main(string[] args)
{
// Тип сервиса
Type serviceType = typeof(StringCrypt);
// URI сервиса
Uri serviceUri = new Uri(URI);
ServiceHost host = new ServiceHost(serviceType, serviceUri); host.Open();
Console.ForegroundColor = ConsoleColor.Green; foreach (Uri uri in host.BaseAddresses)
Console.WriteLine(uri.ToString()); Console.ResetColor();
Console.ForegroundColor = ConsoleColor.DarkGray; Console.Write("Нажмите ENTER, чтобы закрыть хост"); Console.ReadLine();
host.Close();
}
}
}
2.5. Конфигурация службы
Наконец, осталось правильно сконфигурировать наш сервис. Напомню, что планируется реализация механизма уведомления клиентов. То есть общение клиентов и сервиса должно быть двусторонним, поэтому в качестве типа привязки
возьмём wsDualHttpBinding.
Приведём содержимое файла конфигурации нашего сервиса App.config:
<?xml version="1.0" encoding="utf-8" ?> <configuration>

19
<system.serviceModel> <protocolMapping>
<add scheme="http" binding="wsDualHttpBinding" /> </protocolMapping>
<behaviors> <serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" /> </behavior>
</serviceBehaviors> </behaviors>
</system.serviceModel> </configuration>
Рис. 2.5. Внешний вид приложения для запуска службы.
20
2.6. Получение WSDL сервиса
Теперь можно запустить консольное приложение-хост (в противном случае, конечные точки будут недоступны) и перейти к URI службы http://localhost:8080/
Вы увидите экран со ссылкой на WSDL сервиса http://localhost:8080/?wsdl.
WSDL (англ. Web Services Description Language) – язык описания веб-
сервисов и доступа к ним, основанный на языке XML. Каждый документ WSDL можно разбить на следующие логические части:
1.определение типов данных (types) – определение вида отправляемых и получаемых сервисом XML сообщений;
2.элементы данных (message) – сообщения, используемые сервисом;
3.абстрактные операции – список операций, которые могут быть выполнены
ссообщениями;
4.тип порта (PortType) – именованный набор абстрактных операций и абстрактных сообщений. Оконечная точка службы реализует некий тип порта, группирующий взаимосвязанные операции.
5.служба определяет набор взаимосвязанных портов;
6.связывание сервисов (binding) – способ, которым сообщение будет доставлено.
Поскольку контракты описываются на языке WSDL, а программа обычно
работает с типами CLR, возникает необходимость отобразить одну систему типов на другую. В WCF эта задача решается в три этапа. Сначала при написании кода службы вы снабжаете класс определенными в WCF атрибутами [ServiceContract], [OperationContract], [FaultContract], [MessageContract] и [ DataContract]. Затем при написании клиентского кода вы запрашиваете у службы детали контракта. Это делается с помощью Visual Studio или утилиты svcutil.exe, которая вызывает инфраструктурную оконечную точку службы, возвращающую метаданные, необходимые для генерации WSDL документа, получая их от атрибутов. Наконец, на этапе исполнения, когда клиент вызывает какой-то метод, определенный в интерфейсе службы, WCF сериализует типы CLR и вызов метода в формат XML и п о- сылает сообщение в сеть в соответствии с привязкой и схемой кодирования, согласованным посредством WSDL.