Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Создание Web-сервисов в Visual Studio 2008.
Сервисы трансформировали наше представление об Интернете и о том, как его использовать для создания программного обеспечения. До сервисов Интернет был в основном средством размещения кросс-платформенных пользовательских интерфейсов с низкой стоимостью развертывания. Конечно, это было большим достижением (и остается таким) как для интернет, так и для интранет-приложений. Сервисы имеют аналогичный потенциал в плане изменения способа построения наших приложений (как для Интернета, так и для локальных сетей).
По своей сути сервис представляет собой интерфейс (или набор методов), который является «черным ящиком» доступа (при помощи обычных форматов и протоколов) к совместно используемым функциям. При таком определении сервис должен быть слабо связан со своими клиентами и работать с пересечением границ. Эти границы в течение длительного времени мешали применять возможности многократно используемых компонентов приложений (таких как сервисы). Работая с пересечением таких границ, как процессы, компьютеры, языки и операционные системы, сервисы могут использоваться многими потенциальными клиентами сегодняшнего и завтрашнего дня. Visual Studio 2008 и .NET Framework 3.5 позволяют разработчикам создавать ориентированные на сервис приложения без необходимости углубляться во внутренние подробности SOAP, HTTP, удаленного взаимодействия и WDSL.
Вместо этого вы можете сосредоточиться на создании сервисов, которые решают ваши конкретные бизнес-проблемы. После этого вы можете позволить Framework позаботиться о ваших потребностях (в отношении форматов и протоколов).
Сервис определяет контракт между вызывающим клиентом и самим сервисом. Этот контракт утверждает нечто такое: «если вы пришлете мне данные в таком-то формате, то я их обработаю и верну вам результаты в таком-то формате». Формат этих данных и коммуникационные параметры этих вызовов основаны на таких открытых стандартах, как XML и SOAP. Аналогичные стандарты позволяют клиенту «обнаружить» Web-сервис и его контракт, а затем и работать с ним. Эти стандарты сервисов пересекают границы технологий и поэтому делают сервисы очень привлекательными для обмена данными между разнородными средами.
В Web-технологиях протокол HTTP стал вездесущим. Серверы смогли взаимодействовать между собой. Затем пришел стандарт XML для описания сообщений. При помощи этих двух технологий (HTTP и XML) выполнявшиеся на разных платформах приложения получили способ обмена между собой. Они смогли посылать и получать структурированные сообщения по общему протоколу так родились Web-сервисы.
Web-сервисы по-прежнему удерживают доминирующее положение при создании сервисных приложений. Они замечательно подходят для обмена через Интернет. Однако они не всегда являются самым эффективным средством обмена. Например, если клиент и сервис основаны на одной и той же технологии (или даже на одном компьютере), то они часто могут согласовать более эффективный способ для обмена (такой как Remoting удаленное взаимодействие). Разработчики сервисов сталкиваются с теми же проблемами, которых они пытались избежать. Теперь им нужно выбирать между созданием эффективных внутренних сервисов и возможностью получить к ним максимально широкий доступ через Интернет.
И если нужно поддерживать и то, и другое, то, возможно, им придется создавать несколько версий (или, по крайней мере, прокси) для своего сервиса. Эту проблему фирма Microsoft решила при помощи технологии Windows Communication Foundation (WCF). При помощи WCF вы можете создавать ваш сервис без учета границ. После этого WCF позаботится о выполнении вашего сервиса самым эффективным образом (в зависимости от вызывающего клиента). Для решения этой задачи WCF вводит концепцию конечной точки. Ваш сервис может иметь множество конечных точек (настроенных во время программирования или после развертывания). Каждая конечная точка указывает, как именно сервис поддерживает вызывающего клиента через Интернет, через Remoting, через MSMQ и т. д. WCF позволяет вам сфокусироваться на создании функционала вашего сервиса. Она сама позаботится о том, как максимально эффективно обмениваться с вызывающими клиентами. Один сервис WCF может эффективно поддерживать много различных типов клиентов.
Перед тем как начать, разработчику важно понять ключевые концепции и стандартные термины Web-сервисов. Эти знания обеспечат понимание вами того, что происходит в вашем приложении. Они также помогут вам при чтении документации .NET и статей о создании приложений Web-сервисов. Поэтому мы составили следующий глоссарий ключевых терминов, имеющих отношение к Web-сервисам.
Visual Studio делает создание Web-сервисов похожим на разработку других классов и компонентов. Таким образом, сложные аспекты SOAP, WSDL, XSD (и прочего) абстрагируются (и автоматически генерируются данным инструментом). Вы по-прежнему имеете доступ к этим элементам и управление ими (если они вам нужны). Однако по большей части вы определяете Web-сервис точно так же, как создаете класс. Затем вы определяете Web-методы (аналогично тому, как вы определяли бы методы класса). Visual Studio создает соответствующий контракт схемы для сигнатур ваших методов и описывает ваши Web-сервисы в терминах WSDL. Затем .NET Framework позаботится о надлежащей упаковке ваших данных в сообщение SOAP и передаче их по HTTP.
Web-сервисы в .NET создаются и предоставляются в той же самой инфраструктуре, которая предоставляет Web-сайты ASP.NET. Это означает, что Web-сервисы используют ту же самую серверную технологию (Internet Information Services, или IIS) и те же самые объекты (такие как Application, Session и Context). Таким образом, те разработчики, которые знакомы с изготовлением приложений ASP.NET, могут использовать этот опыт для Web-сервисов. Вы можете использовать встроенное управление состоянием, сервисы аутентификации и производительность ASP.NET.
Web-сервис в .NET это просто Web-адрес файла Web-сервиса, имеющего расширение asmx. Сервис имеет стандартный адрес http://.... Этот файл используется как URI для Web-сервиса (аналогично Web-странице). Вы пишете ваш выделенный код для этого файла, а Visual Studio и .NET делают все остальное (прикрепляют соответствующий WSDL и активируют вызовы SOAP no HTTP). Давайте более подробно рассмотрим использование Visual Studio и ASP.NET для предоставления Web-сервисов.
Web-сервис можно добавить в любой Web-проект ASP.NET. Visual Studio предоставляет также и специфичный для Web-сервиса шаблон проекта. Этот шаблон полезен тогда, когда вы хотите создать целый слой сервисов или отделить ваши сервисы от любых элементов пользовательского интерфейса. Проект из этого шаблона вы создаете точно так же, как и другие Web-проекты: выбор File | New | Website приведет к открытию диалогового окна Add New Project (рис. 1). Здесь вы можете выбрать шаблон ASP.NET Web Service Application для того, чтобы описать специфичный для Web-сервиса проект.
Рис.1. Создаем новый проект Web-сервиса
Как и при описании нового Web-сайта, вы можете указать местоположение Web-сервиса. Вы можете выбрать местоположение в файловой системе или указать Web-сервер (работающий по протоколу HTTP), либо использовать FTP для указания места хранения Web-сервиса. Кроме того, вы можете задать язык по умолчанию, на котором должен программироваться Web-сервис.
Реальный проект Web-сервиса (который создается по шаблону Web-сервиса) содержит только один сервис, конфигурационный файл и набор стандартных ссылок. Ссылка на сер вис дается как ссылка на asmx-файл. Этот файл используется как URI (и URL) для Web-сервиса. Фактическое содержимое этого файла показано на рис.2.
Рис. 2. Проект Web-сервиса
Файл с расширением asmx на этом рисунке имеет представление конструктора для добавления компонентов, представление разметки для описания сервиса ASP.NET, а также представление выделенного кода (или просто кода). Вы можете переключаться между представлениями щелчком правой кнопки мыши по asmx-файлу. Представление разметки показывает единственную директиву WebService. Она означает, что файл Web-сервиса является указателем на код сервиса. Атрибут CodeBehind указывает на файл кода с именем WebService.asmx.cs; это файл выделенного кода, который находится в папке App_Code в Solution Explorer. Именно здесь находится логика сервиса. Наконец, в этой директиве используется атрибут Class для указания класса, содержащегося внутри WebService.asmx.cs; этот класс является Web-сервисом. Методы этого класса являются Web-методами.
На рис. 3 показано содержимое WebService.asmx.cs. Прежде всего обратите внимание на то, что этот класс является просто стандартным классом С# (он может быть также классом VB). В нем есть операторы using, определение класса, метод, а также некоторые атрибуты. Модель программирования Web-сервисов .NET-разработчикам должна быть очень хорошо знакома.
Рис. 3. Код Web-сервиса
Конечно, вы должны дать знать .NET о том, что этот код Web-сервис. Для этого есть два способа. В первом используются атрибуты. Класс WebService на рис. 3 помечен атрибутом WebService. Таким образом, класс определен как Web-сервис. Обратите также внимание, что метод HelloWorld имеет атрибут WebMethod. Этот атрибут указывает, что данный метод является Web-методом, который может быть вызван для Web-сервиса.
Другой способ указать на класс как на Web-сервис при помощи наследования. Класс наследует от System.Web.Services.WebService. На самом деле это не обязательно. Вы можете описать класс как Web-сервис без наследования от WebService. Однако при помощи этого наследования класс будет иметь полный доступ к таким функциональным возможностям ASP.NET, как объекты Session и Context. Доступ к этим объектам обеспечивает разработчикам Web-сервисов многие хорошо знакомые функциональные возможности ASP.NET.
Мы рассмотрели стандартные файлы Web-сервиса, создаваемые в Visual Studio при помощи шаблона Web-сервиса. Теперь вы готовы исследовать разработку реального Web-сервиса при помощи Visual Studio 2008. Для примера мы будем разрабатывать Web-сервис ExampleService.
Этот Web-сервис будет обеспечивать методы для получения информации из тестовой базы данных и для сохранения изменений этой информации. Вот основные шаги этого процесса:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibraryData
{
public class UserInfo
{
public string Group { get; set; }
public string Login { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public string LastName { get; set; }
public UserInfo()
{
}
}
public class GroupInfo
{
public int ID_Group { get; set; }
public string Name { get; set; }
}
}
Рис.4. Структура DataSet.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ClassLibraryData;
namespace ClassLibraryMethods
{
public class ServiceMethods
{
public List<UserInfo> GetUsers()
{
List<UserInfo> users = new List<UserInfo>();
exampleDBDataSet dataset = new exampleDBDataSet();
ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter groupsAdapter = new ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter();
groupsAdapter.Fill(dataset.Groups);
ClassLibraryData.exampleDBDataSetTableAdapters.UsersTableAdapter usersAdapter = new ClassLibraryData.exampleDBDataSetTableAdapters.UsersTableAdapter();
usersAdapter.Fill(dataset.Users);
users = (from item in dataset.Users
select new UserInfo()
{
FirstName = item.FirstName,
Group = item.GroupsRow.Name,
LastName = item.LastName,
Login = item.Login,
SecondName = item.SecondName
}
).ToList<UserInfo>();
return users;
}
public List<GroupInfo> GetGroups()
{
List<GroupInfo> groups = new List<GroupInfo>();
exampleDBDataSet dataset = new exampleDBDataSet();
ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter groupsAdapter = new ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter();
groupsAdapter.Fill(dataset.Groups);
groups = (from item in dataset.Groups
select new GroupInfo()
{
ID_Group = item.ID_Group,
Name = item.Name
}
).ToList<GroupInfo>();
return groups;
}
public void AddGroup(string name)
{
exampleDBDataSet dataset = new exampleDBDataSet();
ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter groupsAdapter = new ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter();
groupsAdapter.Insert(name);
}
public void DeleteGroup(int id_group)
{
exampleDBDataSet dataset = new exampleDBDataSet();
ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter groupsAdapter = new ClassLibraryData.exampleDBDataSetTableAdapters.GroupsTableAdapter();
groupsAdapter.DeleteQuery(id_group);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using ClassLibraryData;
using ClassLibraryMethods;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class ExampleService : System.Web.Services.WebService
{
public ExampleService()
{
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod(Description="Получение списка пользователей")]
public List<UserInfo> GetUsers()
{
ServiceMethods met = new ServiceMethods();
return met.GetUsers();
}
[WebMethod(Description = "Полечение списка пользовательских групп")]
public List<GroupInfo> GetGoups()
{
ServiceMethods met = new ServiceMethods();
return met.GetGroups();
}
[WebMethod(Description = "Добавление группы")]
public void AddGorup(string name)
{
ServiceMethods met = new ServiceMethods();
met.AddGroup(name);
}
[WebMethod(Description = "Удаление группы")]
public void DeleteGroup(int id_group)
{
ServiceMethods met = new ServiceMethods();
met.DeleteGroup(id_group);
}
}
Класс атрибута WebService (называемый также WebServiceAttribute) можно использовать для предоставления дополнительных подробностей о данном Web-сервисе. Вы можете применить этот атрибут при объявлении класса Web-сервисом. Однако этот атрибут не обязателен. Он просто дает контекст Web-сервиса. Например, мы использовали атрибут WebService в объявлении класса ExampleService (для того чтобы предоставить подробности о пространстве имен Web-сервиса).
Вот описательные элементы, которые вы можете определить в классе атрибута WebService:
Класс WebService представляет собой базовый класс для Web-сервисов .NET. Его не надо путать с классом атрибута WebService (см. предыдущий раздел). Вы наследуете от этого класса для того, чтобы использовать объекты ASP.NET (такие как Session, Application, Context и т. д.). Однако делать это не обязательно. Visual Studio принудительно реализует такое наследование при описании вами нового Web-сервиса, но вы можете удалить этот код, если не собираетесь использовать в вашем Web-сервисе объекты ASP.NET. Если же вы решили наследовать от WebService, то вы получаете доступ к этим объектам ASP.NET точно так же, как и в любом другом Web-приложении.
Класс атрибута WebMethod служит для указания того обстоятельства, что метод вашего сервиса должен предоставляться через Web-сервис. Это объявление обязательно для всех тех методов, которые вы хотите сделать доступными через Web-сервис.
При описании Web-метода вы можете настроить различные параметры. Они управляют тем, как работает Web-метод. Например, для указания описания метода необходимо настроить Параметр Description. Далее приведен более полный список параметров атрибута WebMethod.
Visual Studio и .NET Framework позволяют вам просмотреть Web-сервис внутри Web-браузера. Эта возможность полезна как для тестирования Web-сервиса, так и для исследования его работы (возвращаемых и требуемых им сообщений). Для доступа к Web-сервису вы сначала собираете (компилируете) его в Visual Studio, а затем запускаете asmx-файл в браузере.
На рис. 5 показан пример Web-сервиса ExampleService в окне браузера. Обратите внимание, что все методы сервиса перечислены. Показано также описание каждого метода. Это то самое описание, которое было указано в определении Web-метода (WebMethodAttribute).
Рис. 5. Переход к Web-сервису в браузере.
Для того чтобы увидеть реальное формальное описание Web-сервиса на WSDL, вы можете выбрать ссылку Service Description (Описание службы) в верхней части страницы (рис. 5). Когда вы нажмете эту ссылку, то внутри QueryString в asmx-файл будет передан параметр WSDL. Это дает указание ASP.NET вернуть WSDL сервиса. WSDL будет сгенерирован. Он соответствует стандартам WSDL и поэтому может использоваться клиентами, которые хотят получить доступ к вашему сервису. Эти клиенты используют WSDL для того, чтобы понять, как работает ваш Web-сервис.
Когда вы щелкаете по названию Web-метода (см. рис. 5), то ASP.NET генерирует для вас Web-форму для тестирования данного метода Web-сервиса. Доступ к этой форме можно получить через asmx-файл с параметром QueryString, равным ор (от англ. operation). Вы передаете в этот параметр название Web-метода. Например, рассмотрим Web-метод AddGroup. Эта Web-форма показана на рис. 6. Верхняя часть формы позволяет вам вводить параметры для Web-метода, а затем вызывать фактический Web-метод при помощи команды POST протокола HTTP. Этот протокол является всего лишь одним из способов вызова Web-метода. Вспомните, что вы используете также и SOAP. На этой странице показаны реальные примеры запроса и ответа SOAP (так же, как и примеры HTTP). Эти примеры могут быть полезны в том случае, если вы хотите знать, как следует формировать сообщения для этих протоколов.
Web-сервис можно использовать при помощи любого клиента, который способен вызывать сервис и управлять его результатами. Visual Studio облегчает эту задачу. Она позволяет вам настроить сервисную ссылку на любой сервис. Этот процесс аналогичен настройке ссылки на другую библиотеку .NET или компонент СОМ. После описания такой сервисной ссылки Visual Studio генерирует локальный класс прокси для использования сервиса. Это позволяет вам программировать при помощи класса прокси и не беспокоиться о написании кода сервиса. Служебные ссылки можно настроить внутри почти любого приложения .NET, в том числе Windows Forms, WPF, консольных приложений и т. д. Давайте же рассмотрим этот процесс.
Рис. 6. Web-метод AddGroup
Определите сервисную ссылку для вашего проекта при помощи выбора опции Add Service Reference (Добавить ссылку на службу) из контекстного меню данного проекта. При этом откроется диалоговое окно Add Service Reference (Добавить ссылку на службу). Используйте это диалоговое окно для перехода к сервису и добавления этого сервиса в качестве ссылки.
По сравнению с предыдущими версиями Visual Studio это диалоговое окно переделано. Оно объединяет все сервисные ссылки (включая Web-сервисы ASP.NET и созданные на основе WCF). На рис. 7 показан начальный экран диалогового окна Add Service Reference.
Рис. 7. Диалоговое окно «Добавить ссылку на службу»
Здесь вы можете ввести URI-адрес вашего сервиса или нажать кнопку Discover (Найти) для поиска уже существующих в вашем решении сервисов. После обнаружения сервисов их можно увидеть в списке слева. Вы можете выбрать интерфейс сервиса и увидеть в правой части его операции. В нижней части формы можно настроить пространство имен для вашей сервисной ссылки. Этим определяется пространство имен, которое будет использовать Visual Studio при генерировании кода прокси для сервиса.
Нажатие кнопки Advanced (Дополнительно) в нижней части диалогового окна Add Service Reference (Добавить ссылку на службу) выдаст вам диалоговое окно Service Reference Settings (Настройка ссылок на службы) (рис. 8).
Рис. 8. Диалоговое окно «Настройка ссылок на службы»
Здесь вы можете управлять тем, как Visual Studio будет генерировать код вашего прокси указать коллекции и область видимости методов вашего прокси (открытые или закрытые).
Обратите внимание на кнопку Add Web Reference (Добавить веб-ссылку) в нижней части окна Service Reference Settings. Она позволяет вам создать Web-ссылку в старом стиле (в стиле .NET 2.0). Пример показан на рис. 9. До введения WCF это был основной способ настройки сервисной ссылки (поскольку существовали только Web-сервисы). Это тоже приводит к генерированию для вас прокси-класса, пространство имен которого определяется содержимым текстового поля Web reference name (Имя веб-ссылки).
Возвратимся к примеру. Привяжем приложение Windows Forms с названием WindowsFormsApplicationExample к Web-сервису ASP.NET с названием ExampleService (который вы уже описали). Для этого примера предположим, что приложение Windows Forms будет существовать независимо от сервиса (в отдельном процессе) и что Web-сервис будет использоваться множеством разнородных клиентов.
Рис. 9. Диалоговое окно «Добавить веб-ссылку»
В нашем примере как приложение Windows Forms, так и сервис находятся в одном решении. Поэтому вы можете использовать диалоговое окно Add Service Reference и нажать кнопку Discover для поиска сервиса (рис. 7). Укажите в качестве пространства имен сервиса значение ServiceReferenceExample и нажмите кнопку ОК для того, чтобы закрыть диалоговое окно и сгенерировать код для ссылки.
Теперь вы можете программировать прокси сервиса, который был сгенерирован для вас. Вы можете также увидеть сгенерированный код. В Solution Explorer выберите опцию Show All Files.
Затем перейдите в каталог Service References. Здесь вы можете увидеть ссылку ServiceReferenceExample. На рис. 10 показано все это вместе с открытым в редакторе классом прокси сервиса. Класс прокси это класс С#, который представляет сервис. Назначение этого класса инкапсуляция и абстрагирование подробностей вызова данного сервиса. Это позволяет разработчикам работать с сервисом точно так же, как они работают с любым другим компонентом или классом .NET. Класс прокси содержит методы (которые имитируют Web-методы) и объекты (которые используются для параметров такие как объект UserInfo в данном примере).
Рис. 10. Web-ссылка
Вы можете вызвать Web-сервис точно так же, как и любой другой класс .NET. Эта возможность имеется благодаря классу прокси, который был для вас сгенерирован. Для этого сделаем ссылку на пространство имен ServiceReferenceExample, а затем создадим новый экземпляр класса ExampleServiceSoapClient:
ExampleServiceSoapClient cl = new ExampleServiceSoapClient();
Этот класс даст вам доступ к Web-методам GetUsers, GetGroups, AddGroup и DeleteGroup (через прокси). Для подключения этих методов к приложению WindowsFormsApplicationExample мы создадим форму, которая покажет список всех пользователей и групп пользователей, а также обеспечит возможность удаления и добавления групп пользователей. Это показано на рис. 11.
Рис. 11. Вкладка «Пользователи» WindowsFormsApplicationExample
При нажатии на кнопку «Загрузить» происходит создание экземпляра класса прокси, вызов Web-метода GetUsers и заполнение DataGridView:
private void button1_Click(object sender, EventArgs e)
{
ExampleServiceSoapClient cl = new ExampleServiceSoapClient();
UserInfo[] users = cl.GetUsers();
dataGridView1.Rows.Clear();
foreach (UserInfo u in users)
{
dataGridView1.Rows.Add(new object[] { u.Group, u.FirstName, u.LastName, u.SecondName, u.Login });
}
}
4*. На выбор: