Выбрать главу

<?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.asmx

Imports 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-служб.

 ' Не изменяйте его вручную в окне редактирования кода.