Россия, Брянск |
Веб-службы ASP.NET
Работа с дизайнером компонентов
Инструментарий предоставляет множество компонентов для добавления в веб-службу. Некоторые из них доступны как в веб-формах, так и в веб-службах, однако в проекте веб-службы недоступны компоненты, предназначенные для создания графического интерфейса для пользователя. Добавление компонентов веб-службы в представлении Design (Дизайн) не влияет на файл Events.asmx. ASMX аналогичен файлу веб-формы ASPX, так как связывает язык, класс, файл Codebehind и файл источника с веб-службой. Отличие заключается в том, что ASMX не содержит другой информации, предназначенной для отображения.
Содержимое файла Events.asmx приведено в листинге 3.1. Если бы этот код предназначался для веб-формы, он содержал бы больший объем кода XML и HTML, определяющего параметры отображения; но он предназначен для веб-службы и содержит лишь одну строку текста.
<%@ WebService Language="c#" Codebehind="Events.asmx.cs" Class="myPortal.Events" %>Листинг 3.1. Source Code of Web Service Events - File Events.asmx
При добавлении компонента подключения (или любого другого) в представление Design (Дизайн) в окне свойств настраиваются параметры этого компонента. Для каждого значения, устанавливаемого в этом окне, дизайнер компонентов генерирует код инициализации в файле Codebehind веб-службы и определяет предпроцессорную команду. Предпроцессорные команды в C# аналогичны командам в C++ и C, отличие же заключается в следующем.
- Предпроцессорные команды языка C# не интерпретируются предпроцессором, отдельным от компилятора. Компилятор и предпроцессор представляют единое целое.
- Команды предпроцессора C# не могут указывать макросы.
Команда #region указывает область, расширяемую или сужаемую в редакторе Visual Studio .NET. Команда #region не оказывает функционального влияния на программное решение.
В коде, сгенерированном дизайнером компонентов, Visual Studio. NET объявляет три элемента:
- ссылку на Icontainer с именем components ;
- подпрограмму InitializeComponent ;
- функцию Dispose.
Все компоненты, добавленные в представлении Design (Дизайн), инициализируются в подпрограмме InitializeComponent. Вызов подпрограммы InitializeComponent автоматически размещается в конструкторе веб-службы. Все свойства, устанавливаемые в окне свойств (см. рис. 3.3), присваиваются компоненту, которому они принадлежат. Комментарии, размещаемые дизайнером компонентов в данной области, предупреждают о том, что не следует изменять код вручную. Область кода, сгенерированного дизайнером компонентов, отображается в виде секции, взаимодействующей с представлением Design (Дизайн) веб-службы.
Экземпляр компонента IContainer используется функцией Dispose. Он содержит ссылки на все экземпляры компонентов внутри веб-службы. Метод Dispose предназначен для освобождения любых ресурсов, заявленных контейнером веб-служб.
Настройка компонента подключения к базе данных
Источником данных для веб-службы Events является база данных SQL Server 2000, поэтому добавим компонент SQLConnection. При поддержке другого типа базы данных используется компонент OleDBConnection. Компонент SQLConnection дает дополнительные возможности по управлению и повышает эффективности работы, в отличие от компонента OleDBConnection, поэтому последний используется только в случае необходимости. Если для источника данных отсутствует провайдер OLE-DB, то загрузите с сайта Microsoft доступен провайдер ODBC, поставляемый в отдельной библиотеке.
Свойство ConnectionString в окне свойств позволяет выбрать предыдущие подключения, настроенные на рабочей станции, или создать новое подключение. Для нашего примера создадим новое подключение (см. рис. 3.4).
После выбора <New Connection...> в качестве параметра свойства ConnectionString откроется окно Data Link Properties (Свойства подключения к данным). В этом окне настраиваются все параметры, представленные в строке подключения ADO.NET. Окно свойств подключения к данным – это общее окно Visual Studio для настройки подключения ADO. Для веб-службы Events используется сервер базы данных, расположенный на сервере AMD1700, и база данных ASPNETServices (см. рис. 3.5).
Изменим имя компонента по умолчанию SQLConnection1 на более дружественное пользователю ServicesDBConn. После настройки и создания подключение SQLConnection работает в любом месте веб-службы. Класс Events наследуется из System.Web.Services. Класс WebService содержит множество классов и функций для взаимодействия с HTTP-соединением. В листинге 3.2 приведен исходный код, сгенерированный Visual Studio .NET для класса Events.
/// <summary> /// Summary description for Events. /// </summary> public class Events : System.Web.Services.WebService { public Events() { //CODEGEN: This call is required by the //ASP.NET Web Services Designer InitializeComponent(); } private System.Data.SqlClient.SqlConnection ServicesDBConn; #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() { this.ServicesDBConn = new System.Data.SqlClient.SqlConnection(); // // ServicesDBConn // this.ServicesDBConn.ConnectionString = "data source=amd1700;initial catalog=ASPNETServices;" + "integrated security=SSPI;persist security info=False;" + "workstation id=AMD1700;packet size=4096"; } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion }Листинг 3.2. Source Code of Class Events after SQLConnection Component Added and Configured
При работе с элементами управления веб-службы использование дизайнера компонентов не обязательно. Элементы управления добавляются в веб-службу посредством объявления и конструирования в файле Codebehind, как и другие переменные и классы. Например, экземпляр объекта SQLConnection можно создать и инициализировать в конструкторе класса Events. Код, приведенный в листинге 3.3, демонстрирует создание локального экземпляра объекта SQLConnection без использования дизайнера компонентов и компонента SQLConnection.
public class Events : System.Web.Services.WebService { //locals to class private System.Data.SqlClient.SqlConnection myConn; public Events() { //CODEGEN: This call is required by the //ASP.NET Web Services Designer InitializeComponent(); System.Configuration.AppSettingsReader myAppSettings = new System.Configuration.AppSettingsReader(); //get the connection string from web.config string sConnect = ((string) (myAppSettings.GetValue ("ProductionDB.ConnectionString", typeof(string)))); //make the DB connection myConn = new System.Data.SqlClient.SqlConnection(sConnect); } #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 }Листинг 3.3. Using SQLConnection Object without the Designer and Obtaining Connection String from the web.config File
В листинге 3.3 экземпляр myConn объявляется локально по отношению к классу Events. Строка подключения извлекается из файла web.config и используется в качестве конструктора экземпляра myConn. После создания экземпляра myConn в конструкторе Events его можно использовать в любом месте класса.
Считывание параметров приложения из web.config
Файл web.config великолепно подходит для получения инициализационных данных, индивидуальных для веб-приложения. Это позволяет создавать решение программно, чтобы получить аргументы, связанных с конкретной реализацией, без внесения изменений в код других реализаций. С помощью класса AppSettingsReader осуществляется считывание данных из секции <appSettings> файла web.config. В листинге 3.4 приведен файл web.config, содержащий строку подключения к базе данных, полученную в листинге 3.3 в конструкторе Events.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <compilation defaultLanguage="c#" debug="true"/> <customErrors mode="RemoteOnly" /> </system.web> <appSettings> <add key="ProductionDB.ConnectionString" value="data source=amd1700; initial catalog=ASPNETServices; integrated security=SSPI; persist security info=False; workstation id=AMD1700; packet size=4096" /> </appSettings> </configuration>Листинг 3.4. web.config File With <appSettings> Element That Contains Database Connection String
Дизайнер компонентов содержит механизм, использующий элемент appSettings файла web.config. В окне свойств компонента подключения в представлении Design (Дизайн) рассматриваемой веб-службы можно настроить параметр ConnectionString как набор динамических свойств DynamicProperties (см. рис.3.6).
По умолчанию свойство ConnectionString не настроено на использование DynamicProperties. Каждое свойство нужно связать с ключом в файле web.config. Ключ представляет собой атрибут с именем key, расположенный в элементе add, подчиненном элементу appSettings (см. рис. 3.4). При нажатии на кнопку "..." в свойстве ConnectionString откроется диалоговое окно для выбора ключа (см. рис. 3.7).