Технология Microsoft ADO.NET

       

Создание web-сервиса


Рассмотрим создание web-службы, предоставляющей возможность получать и обновлять данные из базы Northwind MS SQL Server. Запускаем Visual Studio .NET, создаем новый проект, в списке шаблонов выбираем "ASP.NET Web Service", в строке "Location" вводим название web-сервиса "NorthwindService" (рис. 14.2):


Рис. 14.2.  Создание web-сервиса NorthwindService

Среда генерирует шаблон web-сервиса, который открывается в режиме дизайна (рис. 14.3). Сам по себе web-сервис не имеет пользовательского интерфейса, поэтому у него достаточно специфичный вид. Но в процессе разработки можно использовать визуальные средства студии, размещая на поверхности элементы управления или объекты. В этом смысле режим дизайна web-сервиса аналогичен панели компонент в обычных Windows-приложениях.


Рис. 14.3.  Шаблон web-сервиса

Файл web-сервиса имеет расширение .asmx. Переходим в окно Solution Explorer и переименовываем файл "Service1.asmx" в "DataNorthwind.asmx". Переключаемся в режим кода, нажимая на ссылку "click here to switch to code view" (или просто нажимая клавишу F7). Дополнительно изменяем название класса и конструктора. Разработчики Visual Studio .NET оставили тестовый метод web-сервиса Hello World, который возвращает ставшую классической строку "Hello World". Снимаем с него комментарии. Полностью листинг web-службы будет выглядеть теперь следующим образом:

using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; namespace NorthwindService { /// <summary> /// Summary description for Service1. /// </summary> public class DataNorthwind : System.Web.Services.WebService { public DataNorthwind() { //CODEGEN: This call is required by the ASP.NET //Web Services Designer InitializeComponent(); } #region Component Designer generated code //Required by the Web Services Designer private IContainer components = null; /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion // WEB SERVICE EXAMPLE // The HelloWorld() example service returns the string Hello World // To build, uncomment the following lines then save and build the project // To test this web service, press F5 [WebMethod] public string HelloWorld() { return "Hello World"; } } }


Компилируем сервис, нажимая кнопку F5. Среда генерирует отчет, содержащий описание сервиса, рекомендации, а также его методы и их тесты. Переходим по ссылке "HelloWorld" (рис. 14.4):


Рис. 14.4.  Отчет web-сервиса, генерируемый средой

Появляется окно, в котором можно протестировать результат метода, щелкнув на кнопку "Invoke" (рис. 14.5):


Рис. 14.5.  Тестирование метода HelloWorld

Метод возвращает строку "Hello World" в формате XML, она открывается в отдельном окне (рис. 14.6):


Рис. 14.6.  Результат выполнения метода

Вернемся к коду. При тестировании появлялась рекомендация (см. рис. 14.4) изменить пространство имен web-сервиса перед его публикацией. По умолчанию мастер подставляет пространство из шаблона:

http://tempuri.org/

Перед классом задаем собственное пространство имен и описание web-сервиса при помощи атрибутов Namespace и Desription:

[WebService(Namespace= "http://www.somesite.com/mywebservices", Description="Web-сервис для работы с базой данных Northwind")] public class DataNorthwind : System.Web.Services.WebService { ...

Web-методы также обладают атрибутом "Description", с помощью которого можно задавать описание каждого метода:

[WebMethod (Description="Этот метод разработчики оставили в качестве примера.")] public string HelloWorld() { return "Hello World"; }

Снова компилируем проект. Теперь отчет стал более понятным (рис. 14.7):


Рис. 14.7.  Применение атрибутов Description

Приступим к созданию собственных методов. Переходим в режим дизайна, из вкладки Data окна Toolbox перетаскиваем объект SqlDataAdapter. В появившемся мастере Data Adapter Configuration Wizard настраиваем извлечение всех записей таблицы Customers базы данных Northwind. На поверхности появляются два объекта - sqlDataAdapter1 и sqlConnection1, они выглядят точно так же, как аналогичные объекты на панели компонент обычного Windows-приложения.


Выделяем объект sqlDataAdapter1, в его окне Properties щелкаем по ссылке Generate Dataset. В появившемся окне оставляем предложенное название DataSet. У нас имеются все объекты для написания собственных web-методов. Если мы просмотрим в коде область Component Designer generated code, то обнаружим, что среда сгенерировала описание объектов ADO .NET в точности такое же, как и в обычном Windows-приложении. Добавляем методы3) в классе формы:

[WebMethod (Description="Метод для заполнения данными объекта DataSet")] public DataSet ZapolnenieDannimi() { sqlDataAdapter1.Fill(dataSet11); return dataSet11; }

[WebMethod (Description="Метод для передачи изменений в базу данных")] public bool PeredachaIzmeneniy(DataSet ds) { if (ds.HasErrors) return false; sqlDataAdapter1.Update(ds); return true; }

Параметр [WebMethod] является обязательным при создании web-методов, а атрибут Description - нет. Впрочем, его следует добавлять для удобства работы. Протестируем наш сервис. Переходим по ссылке к методу ZapolnenieDannimi (рис. 14.8):


Рис. 14.8.  Тестирование после добавления собственных методов

При извлечении метода - нажатии кнопки "Invoke" - на его странице появляется сообщение об ошибке:

System.Data.SqlClient.SqlException: Login failed for user 'F202406B87AB496\ASPNET'.

При настройке объекта DataAdapter для подключения к MS SQL Server я выбрал тип аутентификации Windows. Web-служба подключается, используя учетную запись "ASPNET", которая создается при установке Visual Studio .NET. Проблема заключается в том, что эта учетная запись не обладает полномочиями для подключения к базе данных Northwind. Поэтому при отладке и появляется сообщение об ошибке, где "F202406B87AB496" - имя моего локального компьютера. Если мы не хотим использовать аутентификацию SQL-сервера, нужно будет изменить права учетной записи "ASPNET". Запускаем SQL Server Enterprise Manager, раскрываем узел текущего сервера, на вкладке Security щелкаем правой кнопкой и выбираем New Login.


В появившемся окне SQL Server Login Properties нажимаем кнопку обзора (_), в появившемся окне добавляем учетную запись "ASPNET", затем нажимаем "OK" (рис. 14.9):


Рис. 14.9.  Добавление пользователя "ASPNET"

Далее, на вкладке Server Roles отмечаем галочкой "Database Creators" (рис. 14.10). Эта роль предоставляет права создавать и изменять базы данных на сервере.


Рис. 14.10.  Определение роли пользователя "ASPNET"

На вкладке Database Access определяем, к какой именно базе данных будет иметь доступ пользователь "ASPNET". Отмечаем только базу Northwind (рис. 14.11):


Рис. 14.11.  Предоставления доступа к базе "Northwind"

Завершаем настройку учетной записи, нажимая "OK" в окне SQL Server Login Properties. Проверим снова web-сервис - метод ZapolnenieDannimi возвращает теперь содержимое таблицы Customers (рис. 14.12):


Рис. 14.12.  Выполнение метода "ZapolnenieDannimi"

В документе находится XSD-схема объекта DataSet, а также само содержимое в формате XML.

Мы завершили разработку web-сервиса.


Содержание раздела