<?xml version="1.0" encoding"utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3c.org/2001/XMLSchema-insatance" xmlns:xsd="http://www.w3c.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ShowGetRowCountResponse xmlns="http://localhost/">
<ShowGetRowCountResult>int</ShowGetRowCountResult>
</ShowGetRowCountResponse>
</soap:Body>
</soap:Envelope>
Для передачи такого запроса необходимо создать собственный Web-запрос и послать его серверу. К счастью, на платформе .NET в пространстве имен System.NET для выполнения этих действий предусмотрены специальные средства, которые существенно упрощают выполнение этой задачи.
Рассмотрим бизнес-ситуацию, для решения которой следовало бы применить Web-службы.
База данных содержит имена 100 тыс. человек в возрасте от 14 лет до 21 года. Вместе с этими данными хранятся постоянно обновляемые ответы посетителей Web-узла на ежедневно обновляемые вопросы. Допустим, что компания Pepsi хочет регулярно знакомиться с результатами таких опросов, например за 1 млн долларов в месяц. Как предоставить ей доступ к вашей базе данных? Именно в такой ситуации пригодятся Web-службы.
Приведем еще один сценарий.
Допустим, что некий Web-узел выполняет аутентификацию входа на другие Web-узлы, которые платят ежемесячную абонентную плату и предоставляют пароль и учетное имя для создания cookie-файлов на клиентских компьютерах с обозначением аутентификации пользователей. Похоже на службу Microsoft Passport, не так ли? В этой ситуации также пригодятся Web-службы.
Web-службы дают разработчику возможность публиковать свои функции в Web-среде (Internet) или корпоративной среде (intranet), которые входят в состав других приложений или баз данных и располагаются на том же или на другом компьютере, о которых разработчик может даже не подозревать. Web-службы, по сути, стали именно тем, для чего разрабатывались COM-компоненты, но Web-службы можно вызывать с любого компьютера, подключенного к Internet или внутренней сети под управлением любой операционной системы.
Итак, продолжим работу с нашим компонентом и включим в него дополнительную внешнюю функцию.
Публикация существующего компонента с помощью Web-службы
В большинстве случаев для публикации функций существующего компонента с помощью Web-службы достаточно поместить соответствующий код в Web-службе в виде открытого метода с возвращаемым значением. Например, для публикации с помощью Web-службы метода GetRowCount класса GetRowCount из предыдущего примера выполните перечисленные ниже действия.
1. В проекте Novelty1 создайте новую Web-службу NoveltyServices.asmx.
НА ЗАМЕТКУДля работы с компонентом из другого пространства имен следует создать ссылку на него, как описывается выше в главе, в разделе об использовании компонента из другого приложения.
2. В файле NoveltyServices.asmx вставьте код нового Web-метода ShowGetRowCount, который приведен в листинге 12.8.
3. Добавьте в тело метода ShowGetRowCount три строки кода, как показано в листинге 12.8.
4. Щелкните правой кнопкой мыши на имени решения в окне Solution Explorer и выберите в контекстном меню команду Build для компоновки решения.
5. После компоновки решения щелкните правой кнопкой мыши на файле NoveltyServices.asmx и выберите в контекстном меню команду View in Browser (Просмотр в окне Web-броузера).
6. Сразу после загрузки Web-страницы полученной Web-службы NoveltyServices щелкните на гипертекстовой ссылке ShowGetRowCount в верхней части Web-страницы.
7. Убедитесь в правильности полученных результатов. (Сначала в окне Web-броузера появится описание данной Web-службы с предложением проверить ее работоспособность, щелкнув на кнопке Invoke (Вызвать Web-службу). Щелкните на этой кнопке, и в окне Web-броузера появится XML-файл с приведенными ниже строками.
<?xml version="1.0" encoding="utf-8"?>
<int xmlns="http://localhost/">2000</int>
Здесь значение 2000 типа int – это результат выполнения метода ShowGetRowCount Web-службы NoveltyServices. — Прим. ред.)
ЛИСТИНГ 12.8. Файл NoveltyServices.asmxImports System.Web.Services
Imports Novelty1.GetRowCount
<WebService(Namespace:="http://localhost/")> _
Public Class NoveltyServices
Inherits System.Web.Services.WebService
#Region " Web Services Designer Generated Code "
Public Sub New()
MyBase.New()
' Этот вызов метода организован конструктором Web-служб.
InitializeComponent()
' Инициализация после вызова метода
InitializeComponent().
End Sub
' Код, созданный конструктором Web-служб.
Private components As System.ComponentModel.IContainer
' ЗАМЕЧАНИЕ: Код, созданный конструктором компонентов.
' Его можно изменить только с помощью конструктора Web-служб.
' Не изменяйте его вручную в окне редактирования кода.