Опубликован: 24.11.2006 | Уровень: специалист | Доступ: платный
Лекция 3:

Веб-службы ASP.NET

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Работа с дизайнером компонентов

Инструментарий предоставляет множество компонентов для добавления в веб-службу. Некоторые из них доступны как в веб-формах, так и в веб-службах, однако в проекте веб-службы недоступны компоненты, предназначенные для создания графического интерфейса для пользователя. Добавление компонентов веб-службы в представлении 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).


Рис. 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).


Рис. 3.6.

По умолчанию свойство ConnectionString не настроено на использование DynamicProperties. Каждое свойство нужно связать с ключом в файле web.config. Ключ представляет собой атрибут с именем key, расположенный в элементе add, подчиненном элементу appSettings (см. рис. 3.4). При нажатии на кнопку "..." в свойстве ConnectionString откроется диалоговое окно для выбора ключа (см. рис. 3.7).


Рис. 3.7.
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Дмитрий Васюков
Дмитрий Васюков
Россия, Брянск
Maxim Kuzmin
Maxim Kuzmin
Россия