http://www.realcoding.net/article/view/4602
Знакомство с Windows Communication Foundation
Все объявления
Разместить объявление
ЯндексДирект
Офисные программы MicrosoftШирокий выбор лицензионного ПО Microsoft. Подарки при покупке от 5000р. ***** · Москва
Компьютерное обслуживание фирмТехническое обслуживание компьютеров, серверов, сетей, настройка ПО.
Адрес и телефон · ***** · Москва
Программы от MicrosoftШирокий выбор программ от Microsoft в интернет-супермаркете Softkey! www. *****
Знаешь PHP? Есть сайт? Продавай ссылки с сайта (на php), получай от 20$ до нескольких тыс/мес. www. *****
Windows Communication Foundation (WCF) – это платформа корпорации Майкрософт нового поколения для построения распределенных систем. Она была выпущена как часть платформы. NET Framework 3.0 и предназначена для консолидации и расширения интерфейсов API предыдущих версий платформы (например, веб-служб , .NET Remoting, служб Enterprise Services (COM+) и очереди сообщений).
Начало работы с WCF не является трудным, но существует ряд неочевидных моментов. В данной статье подробно описан процесс создания и использования двух простых служб. Для этого необходимо рассмотреть классы служб, размещение служб, настройку служб и клиентские прокси.
Для ваc должны быть установлены расширения Visual Studio 2005, .NET Framework 3.0, and the Visual Studio 2005 для. NET Framework 3.0 (WCF и WPF).
Начните с создания пустого решения с названием GettingStartedWithWCF.

Классы служб
Класс службы реализует функции, предоставляемые операциями службы. Это обычный класс. NET без ограничений наследования. Чтобы класс мог стать классом службы, необходимо применить атрибуты ServiceContract и OperationContract из пространства имен System. ServiceModel. Эти атрибуты присваиваются самому объявлению класса или просто объявлению интерфейса, реализуемого классом. Использование этих атрибутов не означает, что класс являетсяя службой. Это попросту означает, что класс может предоставляться как служба.
Для наших классов службы мы добавим проект библиотеки классов. Для этого щелкните решение правой кнопкой мыши, выберите «Add | New Project» (Добавить | Новый проект) и создайте проект Class Library (библиотека классов) с именем ServiceLib.
. 
Измените имя файла Class1.vb на MathService. vb. Имя класса должно автоматически измениться на MathService. В противном случае измените его вручную.
Добавьте ссылку на System. ServiceModel. Вы будете регулярно использовать эту сборку, поскольку она является сердцем WCF.

Добавьте два метода в класс MathService: складывающий два целых числа (с именем Add) и возводящий число двойной точности в квадрат (с именем Square). Добавьте к пространству имен System. ServiceModel оператор Imports, затем установите для класса атрибут ServiceContract, а для методов атрибут OperationContract.
Imports System. ServiceModel
<ServiceContract()> _
PublicClass MathService
<OperationContract()> _
PublicFunctionAdd(ByVal x AsInteger, ByVal y AsInteger) _
AsInteger
Return x + y
EndFunction
<OperationContract()> _
PublicFunction Square(ByVal x AsDouble) AsDouble
Return x * x
EndFunction
EndClass
Как упоминалось ранее, атрибуты также могут быть применены к интерфейсу. Чтобы продемонстрировать это, добавьте к проекту ServiceLib новый класс HelloService, затем добавьте показанный ниже код.
Imports System. ServiceModel
<ServiceContract()> _
PublicInterface IHello
<OperationContract()> _
Function SayHello(ByVal name AsString) AsString
EndInterface
PublicClass HelloService
Implements IHello
PublicFunction SayHello(ByVal name AsString) _
AsStringImplements IHello. SayHello
Return"Hello " + name
EndFunction
EndClass
Размещения служб
Чтобы возможности класса службы стали доступными для клиентских приложений, необходимо добавить размещение службы. Это приложение, прослушивающее запросы клиентов и создающее экземпляры класса службы для обработки этих запросов. В случае WCF можно использовать в качестве узла службу IIS или создать собственное пользовательское приложение.
Мы создадим размещения обоих типов, начав с веб-размещения. Добавьте веб-узел, щелкнув решение правой кнопкой мыши, выбрав «Add | New Web Site» (Добавить | Создать веб-узел), а затем шаблон WCF Service. Убедитесь, что путь файловой системы указан в папке файла решения.

Взглянем на код шаблона в файле Service. vb. Шаблон предполагает, что код функций для нашей службы будет создаваться здесь, поэтому имеет пример интерфейса и класса службы с верными атрибутами (а также DataContract, который выходит за рамки данной статьи). Мы уже создали классы службы в проекте ServiceLib, поэтому можно удалить файл Service. vb.
Откройте Service. svc и взгляните на значения атрибутов. Размещенные на веб-узле службы используют ту же модель, что и предыдущие технологии . Они связывают файл для перехода с файлом, содержащим код. Это тот же метод фонового кода, который используется в . Поскольку уже имеется скомпилированный класс службы, можно удалить этот атрибут, а затем в качестве значения атрибута Service использовать полное имя типа MathService.
<% @ServiceHost Language=VB Service="ServiceLib. MathService" %>
Наконец, добавьте ссылку на проект ServiceLib.

Теперь выполним сборку решения. После сборки обозреватель решений должен выглядеть следующим образом.

Это хорошо для размещенной на веб-узле службы. Теперь мы перейдем к использованию пользовательского приложения в качестве узла. Для этого можно использовать приложение Windows Forms, консольное приложение или службу Windows. Мы будем использовать консольное приложение.
Щелкните решение правой кнопкой мыши и выберите «Add | New Project» (Добавить | Новый проект). Создайте консольное приложение с именем ConsoleServiceHost.

Нам понадобятся ссылки на System. ServiceModel (для класса, осуществляющего размещение) и ServiceLib (для класса службы), поэтому сначала необходимо добавить эти ссылки.
Теперь размещение службы приложением. NET выполняется очень просто. Необходимо просто создать экземпляр типа ServiceHost, передать его Type для класса службы для размещения, а затем вызвать метод Open. Вызов метода Open приводит к тому, что размещение начинает прослушивать запросы. Поскольку используется консольное приложение, мы добавим вызов ReadLine, чтобы приложение работало после открытия размещения. Также создадим размещение с оператором Using для обеспечения правильного закрытия и удаления после завершения работы консольного приложения. Ранее мы использовали класс MathService, поэтому в этом проекте будем использовать HelloService.
Imports System. ServiceModel
Module Module1
Sub Main()
Dim t As Type = GetType(ServiceLib. HelloService)
Using host AsNew ServiceHost(t)
host. Open()
Console. WriteLine("Service started...")
Console. ReadLine()
End Using
EndSub
EndModule
Настройка службы
Вы могли заметить, что при настройке размещений не указывался способ связи клиента со службой. Способ указывается при настройке службы. И хотя настройка может быть указана в коде, чаще всего она выполняется с помощью XML в файле. config.
Для взаимодействия клиента со службой необходима конечная точка. Конечная точка состоит их трех компонентов: адреса, привязки и контракта. Они известны как основы WCF. Адрес – это URI, определяющий местоположение службы. Привязка используется для определения правил взаимодействия (например, кодирование, обеспечение безопасности сообщений, способ проверки подлинности клиента службой и т. д.). Наконец, контракт определяет предоставляемые службой операции. По сути, это ссылка на класс службы.
В составе WCF поставляется несколько встроенных привязок, настроенных для распространенных бизнес-применений (см. таблицу ниже). Эти привязки можно настроить в конфигурации или можно создать собственные пользовательские привязки в соответствии с потребностями системы. Чтобы не усложнять, мы будем использовать основную привязку HTTP, использующую протокол SOAP 1.1. Имя Транспорт Кодировка Взаимодействие
basicHttpBinding HTTP/HTTPS Текст Да
netTcpBinding TCP Двоичная Нет
netPeerTcpBinding P2P Двоичная Нет
netNamedPipeBinding IPC Двоичная Нет
wsHttpBinding HTTP/HTTPS Текст, MTOM Да
wsFederationBinding HTTP/HTTPS Текст, MTOM Да
wsDualHttpBinding HTTP/HTTPS Текст, MTOM Да
netMsmqBinding MSMQ Двоичная Нет
netIntegrationBinding MSMQ Двоичная Да
Теперь необходимо настроить размещения. Начнем с консольного приложения. Сначала необходимо место для размещения сведений о конфигурации, поэтому добавим файл app. config. Щелкните проект правой кнопкой мыши и выберите «Add | New Item» (Добавить | Новый элемент), затем создайте файл настройки приложения с именем по умолчанию (app. config).
Для настройки конечной точки необходимы адрес, привязка и контракт. Рассмотрим эти элементы в обратном порядке. Контракт уже определен типом, предоставленным конструктору ServiceHost. Для нашего приложения это ServiceLib. IHello. Как упоминалось ранее, будет использоваться привязка basicHttpBinding. Будет использоваться адрес "http://localhost:8081/HelloService", что означает, что клиентам необходимо отправлять сообщения через протокол HTTP на порт 8081 локального сервера, используя HelloService в качестве имени приложения.
Для использования описываемого в следующем разделе мастера создания прокси потребуется выполнить дополнительное действие. В отличие от веб-служб , службы WCF не предоставляют описание службы (или метаданные) автоматически. Для включения этой функции необходимо добавить поведение службы и указать службе на необходимость использования нового поведения.
Замените все содержимое файла app. config приведенным ниже документом XML, чтобы настроить консольное размещение.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system. serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="mexEnabled">
<serviceMetadata
httpGetEnabled="true"
httpGetUrl="http://localhost:8081/HelloService" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service
behaviorConfiguration="mexEnabled"
name="ServiceLib. HelloService">
<endpoint
address="http://localhost:8081/HelloService"
binding="basicHttpBinding"
contract="ServiceLib. IHello" />
</service>
</services>
</system. serviceModel>
</configuration>
Настройка веб-размещения во многом такая же. Различия заключаются в том, что настройка XML содержится в файле web. config, не требуется указывать адрес для конечной точки (он определится адресом файла Service. svc на веб-сервере) и веб-размещением предоставляется контракт MathService, а не HelloService.
Замените все содержимое файла web. config приведенным ниже документом XML, чтобы настроить проект веб-размещения.
<?xml version="1.0"?>
<configuration>
<system. serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="mexEnabled">
<serviceMetadata
httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service
behaviorConfiguration="mexEnabled"
name="ServiceLib. MathService">
<endpoint
address=""
binding="basicHttpBinding"
contract="ServiceLib. MathService" />
</service>
</services>
</system. serviceModel>
</configuration>
Прокси и настройка клиента
Теперь мы готовы к созданию клиентского приложения. Щелкните решение правой кнопкой мыши, выберите «Add | New Project» (Добавить | Новый проект) и создайте приложение Windows с именем ServiceClient.

Для использования наших служб необходима клиентская настройка и прокси. Настройка работает почти так же, как серверная часть, которой необходима конечная точка, совместимая с узлами служб. Прокси – это классы в клиентском проекте, используемые для представления служб, позволяющие вызывать операции службы строго определенным образом.
К частью, в Visual Studio Extensions 3.0 включен мастер для создания необходимой настройки и прокси, использующий метаданные службы. Необходимо знать только верный URL-адрес для размещения службы.
Начнем с размещенной на веб-узле службы. Поскольку был выбран веб-узел на основе файлов, необходимо знать используемый Visual Studio номер порта. Номер порта указан в окне свойств. Щелкните проект веб-узла и найдите номер порта. В моем образце приложения это 13419.

Добавив имя веб-проекта (WebServiceHost) и имя файла SVC (Service. svc), мы получим следующий URL-адрес: http://localhost:13419/WebServiceHost/Service. svc.
Чтобы настроить клиент на использование этой службы и создать класс прокси, правой кнопкой мыши щелкните проект ServiceClient и выберите «Add Service Reference» (Добавление ссылки на службу). В поле «Service URI» (URI службы) введите URL-адрес для службы, а в поле «Service reference name» (Имя ссылки на службу) введите MathProxy и нажмите кнопку OK.

Теперь в клиентском приложении вы должны увидеть файл app. config и элемент MathProxy. map в папке Service References. Они будут рассмотрены после добавления ссылки на размещенную в консоли службу.
Для размещенной в консоли службы URL-адрес для доступа к метаданных службы хранится в файле app. config. Если посмотреть на атрибут httpGetUrl элемента serviceMetadata, вы увидите, что установлен адрес http://localhost:8081/HelloService.
Перед обновлением клиента с помощью мастера «Add Service Reference» (Добавление ссылки на службу) необходимо запустить размещение. Правой кнопкой мыши щелкните проект ConsoleServiceHost и выберите «Debug | Start new instance» (Отладка| Запустить новый экземпляр).
После запуска размещения щелкните проект ServiceClient правой кнопкой мыши, выберите «Add Service Reference» (Добавление ссылки на службу), в поле «Service URI» (URI службы) введите верный URL, а в поле «Service reference name» (Имя ссылки на службу) введите HelloProxy.

После добавления ссылки убедитесь в остановке консольного размещения. В папку Service References клиентского проекта должен быть добавлен элемент HelloProxy. map.
Если открыть файл app. config в проекте ServiceClient, вы увидите созданный мастером код XML. Он выглядит сложным, но на самом деле он простой. Для упрощения настройки параметров мастер помещает в файл несколько атрибутов со значениями по умолчанию. Поскольку атрибуты со значениями по умолчанию не требуется включать в настройку, документ XML может быть упрощен до показанного ниже.
В настройке содержится элемент конечной точки для каждого размещения; атрибуты address и binding этих элементов соответствуют значениям для размещений. Различается только контракт. Это связано с тем, что клиент ссылается не на исходный класс службы, а на клиентский прокси, созданный мастером из метаданных службы.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system. serviceModel>
<client>
<endpoint address="http://localhost:13419/WebServiceHost/Service. svc"
binding="basicHttpBinding"
contract="MathProxy. MathService"
name="BasicHttpBinding_MathService" />
<endpoint
address="http://localhost:8081/HelloService"
binding="basicHttpBinding"
contract="HelloProxy. IHello"
name="BasicHttpBinding_IHello" />
</client>
</system. serviceModel>
</configuration>
В обозревателе решений классы прокси скрыты. Это обусловлено тем, что классы являются созданным кодом, который не предназначен для правки. Для просмотра классов щелкните решение ServiceClient, затем нажмите кнопку «Show All Files» (Показать все файлы) на панели инструментов обозревателя решений. После этого можно развернуть элементы HelloProxy. map и MathProxy. map для просмотра файлов.
Теперь, когда есть ссылки на службы, можно создать пользовательский интерфейс для тестирования служб. В форму Form1 добавьте три элемента управления TextBox и два Button с именами, показанными красным цветом под элементами. Для текстовых полей укажите значения по умолчанию, чтобы упростить тестирование работы службы.

При нажатии кнопки SayNameButton должен вызываться метод SayHello класса HelloService с передачей содержимого элемента NameTextBox в качестве параметра. Для отображения результатов можно использовать функцию MsgBox. При нажатии кнопки AddButton должен быть вызван метод Add класса MathService с передачей содержимого элементов XTextBox и YTextBox, преобразованного в целые числа в качестве параметров. Опять же, для отображения результатов можно использовать функцию MsgBox.
PublicClass Form1
PrivateSub SayNameButton_Click( _
ByVal sender As System. Object, ByVal e As System. EventArgs) _
Handles SayNameButton. Click
Using ws AsNew HelloProxy. HelloClient
MsgBox(ws. SayHello(NameTextBox. Text))
End Using
EndSub
PrivateSub AddButton_Click(ByVal sender As System. Object, _
ByVal e As System. EventArgs) Handles AddButton. Click
Dim x AsInteger = Integer. Parse(XTextBox. Text)
Dim y AsInteger = Integer. Parse(YTextBox. Text)
Using ws AsNew MathProxy. MathServiceClient
MsgBox(ws. Add(x, y).ToString())
End Using
EndSub
EndClass
При запуске клиента необходимо убедиться, что консольное размещение тоже работает (оно должно быть запущено для прослушивания запросов к службе HelloService). Для этого мы используем несколько автозагружаемых проектов. Щелкните решение правой кнопкой мыши и выберите «Properties» (Свойства). Настройте свойства автоматического запуска, как показано ниже, и нажмите OK.

Наконец, мы готовы к запуску клиента и тестированию служб. Нажмите F5, чтобы запустить клиент и узел консоли, затем нажмите на кнопки. Если все сделано правильно, вы должны увидеть следующие результаты (предполагая, что использовались значения, показанные на снимке экрана выше).


Заключение
В данной статье был подробно описан процесс создания и использования простых служб при помощи WCF, также были рассмотрены основы технологии. В добавление к возможности создания служб, теперь вы должны иметь представление о классах служб, размещении служб, настройке служб и клиентских прокси.
В дальнейших статьях этот материал будет расширен; будут рассмотрены привязки, безопасность, сериализация данных, создание экземпляров, инструментирование и многое другое.
О Робе Виндзоре
кластер серверов
Создание отказоустойчивых кластерных платформ. ИТ-консалтинг. Сервис.
www. ***** - Москва
Управление персоналом. Семинар
Всё об управлении кадрами в современной организации! Обучитесь!
***** - Москва
Рубрика: .NET Framework 3.0 Добавлено: admin 23.09.2007 11:46


