Языки информационного обмена

         

Архитектура web-служб .NET


Реализация web-служб .NET осуществляется так же просто, как и активизация удаленной web-службы или вызов метода локального класса. Это достигается за счет применения инструментов, предоставляемых системой .NET Framework, которые позволяют создать полноценную web-службу, не вникая в детали работы таких стандартов, как SOAP и WSDL. Порядок действий при этом подобен приведенному ниже (обратите внимание, что этапы 1, 3, 5 и 8 выполняются вручную).

Вы разрабатываете web-службу как .NET-класс с атрибутами, которые идентифицируют его как web-службу с некоторыми функциями.В среде .NET автоматически создается документ WSDL, где описывается, как клиент должен взаимодействовать с web-службой. Потребитель находит вашу web-службу и, решив воспользоваться ею, добавляет соответствующую web-ссылку в проект Visual Studio .NET (или запускает утилиту wsdl.exe). В среде .NET осуществляется автоматическая проверка документа WSDL и генерируется прокси-класс, который позволяет потребителю взаимодействовать с web-службой. Потребитель вызывает один из методов вашего класса web-службы. С его точки зрения этот вызов не отличается от вызова метода любого другого класса, но в действительности потребитель взаимодействует с прокси-классом, а не с web-службой. Прокси-класс преобразует, переданные параметры в сообщение SOAP и отправляет его web-службе.Вскоре прокси-класс получает SOAP-ответ, преобразует таковой в соответствующий тип данных и возвращает его как обычный тип данных .NET. Потребитель использует возвращенную ему информацию.

Описанный процесс схематически показан на рис.12.3.


Рис. 12.3.  Взаимодействие с web-службой

При работе web-служб .NET используется технология ASP .NET, являющаяся частью системы .NET Framework. Она также требует поддержки со стороны сервера Microsoft IIS (Internet Information Server). Среда Visual Studio .NET обеспечивает большое количество инструментов, которые помогают облегчить решение задач, связанных с получением и выполнением web-службы.



Базовые технологии


Для создания и использования web-службы не требуется глубоких знаний о технологии, лежащей в ее основе. Однако если вы хотите создать web-службу, реализующую лучшие свойства платформы, и избежать при этом наиболее распространенных ошибок, без понимания работы базовых технологий вам не обойтись.

Работа web-служб построена на использовании различных открытых стандартов, которые описаны в таблице.

ТехнологияНазначение
WSDLОснованный на XML формат описания web-службы, ее методов, типов данных параметров и возвращаемого значения, а также поддерживаемых методов коммуникации
HTTPКоммуникационный протокол, служащий для отправки запросов web-службе через Интернет. (Кроме того, это распространенный стандарт, применяемый для передачи web-страниц web-браузеру)
SOAPОснованный на XML формат кодирования информации в запросе, посылаемом web-службе, и ответном сообщении для отправки таковых через Интернет. Например, SOAP определяет способы представления величин различных типов данных
DISCOНеобязательная спецификация Microsoft, позволяющая клиентам находить требуемые web-службы. DISCO-файл является, по сути, несистематизированным списком связей с web-службами. В настоящее время вытесняется стандартом WS-Inspection.
UDDIКаталог, который позволяет клиентам находить web-службы, предоставляемые конкретной компанией. UDDI является самым молодым среди стандартов web-служб

WSDL представляет собой стандарт, разработанный только для web-служб .NET. С целью обеспечения совместимости с другими платформами. При создании web-служб рекомендуется использовать формат SOAP, но допускается также применять методы POST и GET протокола HTTP. Спецификации DISCO и UDDI представляют собой необязательные расширения, которые облегчают публикацию и поиск информации о web-службах. Однако на сегодняшний день наиболее логичным способом передачи информации является HTTP-коммуникация, и нет смысла от нее отказываться.

К числу менее распространенных стандартов, используемых при создании web-служб, относится WS-Inspection - спецификация для поиска документов, в которых перечислены группы web-служб и их местонахождение. Эта спецификация была разработана совместными усилиями компаний Microsoft и IBM и предназначалась для замены протокола DISCO.

Кроме того, имеются конкурирующие спецификации, служащие для преодоления некоторых присущих web-службам ограничений, к которым можно отнести отсутствие транзакций, аутентификации, лицензирования и шифрования. Ни одна из подобных спецификаций не достигла уровня установленного стандарта и не была включена в .NET, но, возможно, в будущем это произойдет.



Что такое web-служба


Web-служба (Web Service) - это приложение или блок находящегося на web-сервере выполняемого кода, функционирование которого основано на применении стандартных форматов XML. Поиск этого кода, его извлечение и получение посредством него требуемого результата выполняется в среде .NET Framework. Вызывается web-служба .NET так же просто, как и локальная функция.

Web-служба .NET - это не объект (во всяком случае, не в его традиционном представлении). Web-метод является, по сути, независимым, "атомарным" и не имеющим постоянного местонахождения. Web-служба больше подобна библиотеке функций в DLL и ее сложно ограничить рамками объектно-ориентированной абстракции. Это упрощение в значительной мере и обеспечивает преимущества web-служб. Поскольку web-службы не ограничены конкретной технологией (безопасности, управления или транспортировки), они могут быть использованы почти в любом разрабатываемом сценарии, что существенным образом отличает их от предыдущих технологий, таких как СОМ и CORBA.



Для чего нужны web-службы


Web-службы предоставляют способ совместного использования программных функций. Их даже можно назвать "СОМ для Web", хотя в основе работы этих систем лежит совсем другая технология.

Web-служба не является продуктом для конечного пользователя. Она представляет собой основанное на компонентах приложение, позволяя многократно использовать свою функциональность в различных средах и на клиентах разных типов. Пользователем web-службы всегда является другое приложение.

Web-службы могут использоваться для решения следующих задач:

С целью осуществления В2В-транзакций или соединения внутренних систем отдельных компаний

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

В качестве готовых модулей для разработчиков

Допустим, независимый разработчик спроектировал web-службу аутентификации, предназначенную для применения в среде ASP .NET. Если вы пожелаете воспользоваться этой службой, то за соответствующую плату можете приобрести месячную подписку на нее. Однако данный процесс будет совершенно прозрачным для конечного пользователя, который решит, что указанные средства аутентификации являются частью вашего приложения. Такие готовые компоненты можно использовать в web-приложениях, а также в настольных и мобильных программах.

Для придания дополнительных товарных качеств клиентским приложениям

Компания Microsoft выдвинула инициативу создания технологии встройки, которая позволила системным администраторам осуществлять дистанционное администрирование с применением web-служб. Банк, который имеет намерение открыть вам инвестиционный счет, заинтересован в наличии web-службы для загрузки информации о транзакциях, которую можно было бы использовать без необходимости тратиться на финансовую программу наподобие Quicken.
Пока конечные пользователи не получат напрямую требуемую услугу, ее доступность в Quicken может вынудить их открыть счет в другом банке, который предоставляет данную программу.

В качестве компонентных библиотек DLL для многократного использования кода



Самый простой способ многократного использования определенных функциональных возможностей в приложениях ASP .NET заключается не в создании сборки .NET, а в проектировании web-службы, к которой могли бы обращаться различные клиенты, в том числе настольные приложения, PDA и мощные браузеры, такие как Internet Explorer. При этом не важно, где располагаются web-службы и клиенты, необходимо лишь наличие Интернет-соединения между клиентом и службой.

В качестве инструментов, обеспечивающих взаимодействие различных программ в рамках одной компании

Web-службы можно использовать, в частности, для соединения специализированной программы по работе с платежными ведомостями с бухгалтерским программным обеспечением через защищенную корпоративную сеть (а не через Интернет).




Достоинства web-служб .NET


Web-службы были разработаны с целью преодоления ограничений описанных выше технологий. С помощью .NET компания Microsoft надеется построить более совершенную структуру программирования для создания и предоставления web-услуг.

Web-службы .NET отличаются от существующих технологий создания распределенных приложений следующими характеристиками.

Открытость стандартов

В web-службах отсутствуют какие-либо скрытые или недоступные элементы. Каждый аспект технологии, от способа поиска web-службы до ее описания и организации связи с ней, определен общедоступными стандартами. Доступность информации способствует дальнейшему расширению и развитию данной технологии.

Межплатформенность

Язык программирования, который позволяет создавать XML-документы и отправлять информацию посредством HTTP, позволяет взаимодействовать с любой web-службой. Вы можете получить web-услугу из системы, отличной от .NET. Самое приятное то, что вам никогда не придется ориентироваться на определенный "уровень совместимости" - web-службы .NET изначально встроены в открытые стандарты.

Простота

Рассматривая различные стандарты, которые используются для реализации web-служб, нельзя не отметить простоту, элегантность и легкость их применения. Это сводит к минимуму количество ошибок при разработке, но также означает, что программисты должны создавать свои собственные функции обеспечения безопасности, управления состоянием и выполнения транзакций.

Поддержка сообщений на понятном человеку языке

Переход от двоичных стандартов, применяемых в СОМ и CORBA, к XML-тексту позволил упростить исправление ошибок и обеспечил возможность осуществлять взаимодействие с web-службами по обычным каналам HTTP, без усилий отправляя сообщения через брандмауэры. Но такое изменение привело к нескольким потенциальным неудобствам. Один из недостатков состоит в том, что сообщения web-службы требуют большего количества байтов для передачи одного и того же объема информации.



История развития web-служб


История программирования в значительной степени представляет собой процесс перехода от небольших изолированных сред (таких как мэйнфреймы и автономные приложения) к более широкомасштабным и многокомпонентным системам, начиная от сетевого и клиент-серверного программного обеспечения и заканчивая Интернет -приложениями и распределенными приложениями.



Модель COM/DCOM


DCOM - это сетевой протокол, основанный на стандарте распределенной среды обработки DCE (Distributed Computing Environment). Достоинством протокола DCOM является используемая модель программирования. Этот протокол позволяет разработчикам применять СОМ- объекты на удаленном компьютере точно так же, как и на локальном (рис. 12.1). DCOM просто переносит локальную межпроцессную связь с помощью сетевого протокола. Вызов становится несколько более медленным, но ни клиенту, ни компоненту нет необходимости знать, что связь между ними осуществляется по сети. На рис. 12.1 показан многоуровневый протокол, позволяющий модели СОМ работать через сеть.


Рис. 12.1.  Архитектура COM/DCOM

К сожалению, модель COM/DCOM не подходит для работы в распределенных сетях.

Применить DCОМ в сети приводит к большим издержкам из-за возникновения помех и большого количества отложенных сообщений. Очевидно, что применять DCОМ в сети Интернет тем более не имеет смысла, поскольку по мере роста числа клиентов в сети объем сетевого трафика увеличивается и необходимость обрабатывать большое количество запросов наносит серьезный вред всей системе. Таким образом, разработчики пришли к выводу, что протокол DCOM является принципиально не масштабируемым для обслуживания большого числа клиентов. Кроме того, указанные ограничения делают невозможным использование DCOM-компонента в случае ненадежной или периодически устанавливаемой связи.



Недостатки существующих стандартов


Несмотря на имеющиеся различия, технологии COM/DCOM и CORBA/IIOP обладают рядом общих ограничений:

Ориентирование на двоичную связь

Данная особенность затрудняет использование указанных стандартов при наличии в сети брандмауэров, которые ограничивают доступ нетекстовых данных через большинство портов. Даже если брандмауэр сконфигурирован так, что подобные данные могут поступать через порт, изменение каких-либо настроек (что обычно и случается) приведет к разрыву объектной коммуникации.

Проблемы масштабирования

С помощью СОМ и CORBA можно спроектировать компоненты, способные взаимодействовать с сотнями клиентов так же легко, как и с десятками. Однако это требует от программистов огромного опыта и дисциплины. Типичный компонент того не стоит.

Зависимость от платформы или языка программирования

Протокол СОМ тесно связан с платформой Windows. Не существует простого способа создать и разместить СОМ-компонент в другой операционной системе, такой как UNIX. Модель CORBA подобным недостатком не обладает, но ее сложно использовать в языках, отличных от Java. В конечном счете, оба этих стандарта оказываются "закрытыми", что ограничивает сферу и способы их использования.

Сложность

Стандарты СОМ и CORBA включают множество встроенных средств, таких как транзакции, инструменты безопасности и шифрования, что повышает вероятность возникновения проблем, связанных, в частности, с несовместимостью и дополнительными затратами. В настоящее время протоколы web-служб не предоставляют и не специфицируют инструменты API для указанных высокоуровневых служб. Этот факт значительно упрощает их реализацию, но означает, что в случае необходимости вам придется самостоятельно разрабатывать такие средства.

Отсутствие универсального стандарта для представления данных

Рассматривая историю развития совместного использования программного кода в сетях, мы оставили без внимания такой важный вопрос разработки, как эволюция универсального стандарта для кодирования информации. Это объясняется тем, что в то время, когда создавались технологии СОМ и CORBA, стандарта для совместного использования структурированных данных не существовало. И лишь позднее появились такие стандарты, как SGML, XML и SOAP, предназначенные непосредственно для представления типов данных.

Несмотря на все выше сказанное технологии СОМ и CORBA по-прежнему широко используются. Конечно, у них есть свои недостатки, но они отнюдь не потеряли еще своей работоспособности. В некоторых отношениях они не способны конкурировать с web-службами, но могут стать идеальным инструментом для реализации распределенных компонентов в гетерогенной сетевой среде.



NET MyServices


.NET MyServices (первоначальное название - Hailstorm) представляет собой ориентированный на пользователя набор web-служб, разработанных компанией Microsoft. MyServices находится на вершине структуры .NET Framework и предназначен для предоставления некоторых основных функций, к которым приложения будут получать доступ, чтобы совместно использовать пользовательскую информацию.

Службы .NET MyServices выполняют такие функции, как сопровождение информации, поддержка аутентификации, а также выдача уведомлений для отдельных пользователей. Хотя названные службы ориентированы на конечных пользователей, однако таковые не взаимодействуют с ними напрямую, как это происходит в случае обычных web-служб. К данным службам для получения базовой информации и высокоуровневых функций обращаются приложения. Большинство служб .NET MyServices являются стандартизированным интерфейсом web-служб онлайнового хранилища данных. К таким данным может относиться все что угодно, от бизнес- календаря с указанием дат встреч до финансовых отчетов.

Первоначально компания Microsoft планировала хранить все наборы служебных пользовательских данных для MyServices на своих серверах. Потенциальные партнеры, однако, скептически отнеслись к такому способу размещения информации и потребовали предоставления возможности выбора места хранения своих данных. Поэтому было принято решение о том, что MyServices будет позволять организациям самостоятельно поддерживать свои службы MyServices и собственные (возможно, связанные) хранилища данных.

В настоящее время самой известной (и наиболее важной) частью .NET MyServices является система аутентификации Passport, которая разрабатывалась для сервера Hotmail и предназначалась для проверки паролей доступа к электронной почте. Позднее Passport превратилась в полноценную web-службу и сегодня используется многими компаниями для аутентификации своих клиентов. Данная система также доступна для потребительских web-узлов через систему ASP .NET Framework и может использоваться в качестве простого средства для идентификации пользователей.



NET Remoting


.NET Remoting - это технология распределенных компонентов, заменившая модель DCOM в среде .NET. Она остается идеальным средством во многих ситуациях, когда web-службы .NET оказываются неподходящими, в частности применяется при работе приложений, требующих совместного использования больших объемов информации либо при необходимости сокращения времени ответа. Однако в отличие от web-служб технология .NET Remoting разрабатывалась не с целью совместного использования и публикации служб (таких как DISCO-файлы и UDDI) несколькими компаниями.

Сегодня .NET Remoting представляет собой расширяемую технологию, которая способна поддерживать различные протоколы передачи данных, в том числе HTTP и SOAP. Таким образом, данная технология могла бы составить конкуренцию web-службам, если бы не тот факт, что .NET Remoting не поддерживает UDDI и в ней используется специальный .NET-ориентированный формат сериализации.

Технология .NET Remoting может оказаться полезной лишь при необходимости создать распределенную систему, которая работает в довольно гомогенной (однородной) среде и не требует взаимодействия с множеством клиентов. Иными словами, эта технология больше подходит для внутрикорпоративных решений и в меньшей степени - для основанной на стандартах разработки, требующей совместимости с большим количеством проектов других организаций. Технология .NET Remoting используется в локальной сети компании или при работе с группой постоянных клиентов в Интернете. В отличие от web-служб .NET, для хост-компонентов .NET Remoting не требуется наличия ASP .NET или IIS.



Основные понятия web-службы


Сегодня доступ к Интернету можно получить с помощью различных устройств, обеспечивающих большое разнообразие функциональных средств. В большинстве случаев обмен информацией в Интернете осуществляется посредством запросов и ответов с использованием открытых протоколов, в частности HTTP. Обычно большая часть такой информации представлена на языке HTML, специальные теги которого позволяют организовать пользовательский интерфейс в отображаемых браузером web-страницах.


Web-службы - это технология предоставления совместно используемых функций, не зависящих от устройств, сетей, операционных систем и языков программирования.



Основы web-служб


Концепция, лежащая в основе функционирования web-служб, не нова. Существует множество и других сред программирования, которые базируются на принципе разделения приложений и функций между компьютерами по сети, позволяющем сделать работу их пользователей более эффективной и гибкой. Однако до сих пор ни одна из таких сред не приобрела широкой популярности, поскольку с их применением связаны две проблемы: внутренняя сложность системы и гетерогенная природа Интернета, связывающего компьютеры с разными операционными системами, сетями и платформами разработки.



Протокол SOAP


Связь между web-службами и их клиентами осуществляется посредством сообщений в формате XML. SOAP (Simple Object Access Protocol - простой протокол доступа к объектам) представляет собой протокол сообщений для выбора web-служб. Использование слова Object в названии данного протокола является не совсем корректным, поскольку сообщения SOAP не направляются объектам. Основная идея стандарта SOAP заключается в том, что сообщения должны быть закодированы в стандартизированном XML-формате. Можно сказать, что формат SOAP идеально подходит для технологии RPC (Remote Procedure Call - вызов удаленной процедуры), так как SOAP-сообщение содержит направляемые клиентом параметры или отсылаемую службой возвращаемую величину. Нет ничего удивительного в том, что другие программные продукты (скажем, сервер BizTalk компании Microsoft) применяют протокол SOAP для передачи иных типов информации. Аналогично, SOAP-сообщения могут использоваться не только при передаче по протоколу HTTP, но также при пересылке через сокеты, именованные каналы и даже по протоколу SMTP электронной почты.

Кроме сообщений SOAP, для обмена данными с web-службами .NET можно использовать методы GET и POST протокола HTTP. Теоретически при передаче информации методом POST вы можете по-прежнему применять формат SOAP, но в этом случае данные проще передавать в виде набора имя-значение без указания их типа.

Давайте рассмотрим преимущества применения формата SOAP.

Более гибкие типы данных

Кодировать в XML структуры данных и наборы DataSet с использованием SOAP так же легко, как и данные простых типов (скажем, целого или строкового).

Поддержка заголовков и расширений

При использовании SOAP-сообщений предоставляются дополнительные инструменты, позволяющие легко добавлять, например, функции обеспечения безопасности или трассировки.

Истинная межплатформенность

Протокол SOAP лучше всего подходит для получения .NET-услуги на обычном клиенте. Имеются наборы инструментов SOAP для различных языков программирования (и даже для предыдущих версий Microsoft C++ и Visual Basic). Чтобы обеспечить связь с web-службой посредством методов GET и POST протокола HTTP, придется, очевидно, вручную сконструировать строку запроса, а затем вручную провести синтаксический разбор ответа, что, согласитесь, является не самым элегантным решением.



Сервер BizTalk


Сервер BizTalk позволяет разработчикам наладить бизнес - связи как в отдельной организации, так и между деловыми партнерами. Хотя текущая версия сервера BizTalk построена на основе СОМ - технологии, существует множество способов расширить его возможности с помощью встроенных элементов .NET и интегрирования с web-службами .NET. Обзор подобных методов представлен в документе, доступном по адресу http://www.microsoft.com/diztalk/techinfo/development/wp_XML-Frame.doc.

При ближайшем рассмотрении сервер BizTalk оказывается, по сути, хостом для дополнительных высокоуровневых служб, которые разработчик может использовать для интегрирования бизнес-процессов. Например, с помощью сервера BizTalk можно создавать интерфейсы, позволяющие различным процессам взаимодействовать друг с другом даже тогда, когда для работы одного процесса требуются данные в формате, отличном от предоставляемого другим. Вы можете также конфигурировать длительные распределенные транзакции, проектировать рабочий поток документов с использованием визуальных средств проектирования, предписывать правила ведения бизнеса, а также обмениваться сообщениями в формате SOAP. Чтобы описать возможности сервера BizTalk, требуется отдельная книга, но он представляет интерес, главным образом, для разработчиков, которые проектируют программное обеспечение для В2В-взаимодействия.

<

Система обмена сообщениями


Microsoft, Sun и многие другие компании предоставляют системы обмена сообщениями, которые допускают коммуникацию типа "store-and-forward" (сохранение и отправка далее). Такая модель не подходит для ситуаций, когда требуется немедленный ответ, но применима в случае односторонней связи наподобие регистрации. Серверные программные средства обмена сообщениями, например MSMQ (Microsoft Message Queuing - организация очередей сообщений), обеспечивают богатый набор функций, включая транзакции, и оказываются скорее помощниками, чем конкурентами web-служб. Однако web-службы относятся к числу более распространенных технологий и могут рассматриваться в качестве более простой модели для реализации удаленных вызовов функций, а не только односторонних сообщений. Кроме того, web-службы поддерживают асинхронный режим работы.



Совместное использование кода на нескольких компьютерах


В середине 90-х годов компания Microsoft выпустила расширенную компонентную модель - DCOM (Distributed СОМ). Эта модель не являлась альтернативой или дополнением модели СОМ - в действительности она была лишь сетевым протоколом, определяющим способ взаимодействия СОМ-объектов различных компьютеров. Компания OMG также представила сетевой протокол, получивший название IIOP (Inter-ORB Protocol), который был разработан с целью обеспечения возможности совместной работы в Интернете отдельных объектов ORB CORBA.

Эти стандарты позволили приложению, запущенному на одном компьютере, использовать код, расположенный на другом компьютере. Но поскольку оба указанных стандарта являлись потомками стандартов разработки настольных приложений, они имели несколько уровней сложности, затрудняющих их применение (в частности, модель DCOM за это часто критиковали). Опытные разработчики считают, что эти протоколы сыграли положительную роль, обеспечив возможность создавать приложения, которые могут выполняться распределено на нескольких рабочих станциях, тем самым позволив подняться от разработки клиент-серверного программного обеспечения до так называемых 3-уровневых и n-уровневых приложений.



Совместное использование кода приложениями


В начале 90-х годов прошлого века интерес разработчиков привлекали две соперничающие компонентные технологии: архитектура компонентной объектной модели (Component Object Model, СОМ) компании Microsoft и обобщенная архитектура построения брокеров объектных запросов (Common Object Request Broker Architecture, CORBA), представленная компанией OMG (Object Management Group). Обе эти технологии предоставляют функции, которые можно многократно применять как двоичные объекты, а также программное обеспечение для совместного использования кода на одном компьютере.

Однако по мере того как распределенные сети приобретали все более широкую популярность, возникла необходимость в обеспечении возможности взаимодействия отдельных компьютеров. Разработчики могли создавать собственные решения, воспользовавшись сокетами, хотя это требовало от клиентов и серверов выполнения достаточно тяжелой работы, а для кодирования и декодирования сообщений нужны были высокоуровневые протоколы. Но не только в этом состояло неудобство для разработчиков: их программы получались громоздкими и могли содержать множество ошибок.



Совместное использование кода в различных сетях


К сожалению, ни COM/DCOM, ни CORBA/IIOP не функционировали должным образом в рамках Интернета. В частности, потому, что оба этих стандарта являются взаимно исключающими. Серверы DCOM могут взаимодействовать только с клиентами DCOM, стандарты CORBA и IIOP также имеют некоторые недостатки. Сфера применения DCOM ограничена компьютерами, оснащенными операционной системой Microsoft Windows. Модель CORBA, подобно СОМ, является сложным стандартом, не предназначенным для работы через брандмауэры. Таким образом, помимо необходимости адаптировать модели СОМ и CORBA для использования в сетевой среде, требовалось создать простые программные средства разработки распределенных приложений в сети Web.



Спецификация UDDI


Спецификация UDDI (Universal Description, Discovery, and Integration - универсальное описание, поиск и интеграция) позволяет избежать указанных проблем посредством использования специального хранилища (репозитория), где предприятия и организации могут размещать данные о предоставляемых ими web-службах. Инициаторами создания технологии UDDI стали более 100 компаний (полный список можно найти по адресу http://www.uddi.org/community.html), включая основных конкурентов - Sun и Microsoft. Объединив свои усилия, эти компании разработали проект спецификации UDDI, которая по истечении 18 месяцев была стандартизирована. Конечно, информация в подобном репозитории должна обновляться вручную. С этой целью некоторые "узловые операторы" хранят идентичные копии репозитория UDDI. Эти компании обеспечивают хранение указанного репозитория и бесплатный доступ к нему для популяризации web-служб. Кроме того, Microsoft включила версию UDDI в программное обеспечение сервера Windows .NET для использования в корпоративных сетях интранета.

В хранилище UDDI содержатся сведения о предприятиях, предоставляющих web-службы, о типе каждой службы и связях с информацией и спецификациями, относящимися к этим службам. Любопытным фактом является то, что интерфейс UDDI сам по себе представляет собой web-службу. Для регистрации или поиска службы следует отправить SOAP-сообщение.



Спецификация WSDL


Каждая web-служба предоставляет документ WSDL (Web Service Description Language - язык описания web-службы), в котором описывается все, что клиенту необходимо знать об этой службе. WSDL-документ служит тем же целям, что и файл IDL (Interface Definition Language - язык определения интерфейса) для компонента CORBA или СОМ: он определяет интерфейс web-службы. Указанный документ, по сути, представляет собой контракт между клиентом и web-службой, где декларируется, что "если вы вызовете такой-то метод с такими-то параметрами, то в качестве возвращаемой величины получите такие-то данные".

Во многих отношениях web-службы даже проще, чем создаваемые для CORBA или СОМ компоненты. Например, в web-службах отсутствует возможность поддержки нескольких интерфейсов - каждый класс web-службы обеспечивает только один набор открытых (public) методов. С другой стороны, документ WSDL немного сложнее своего IDL-эквивалента, поскольку он является платформонезависимым и поддерживает коммуникационные протоколы, отличные от SOAP и HTTP. Это означает, что каждый WSDL-файл для web-службы .NET содержит значительный объем стереотипного кода, служащего для обеспечения поддержки базового уровня коммуникации (в соответствии с протоколом SOAP или методами GET и POST протокола HTTP).

ПРИМЕЧАНИЕ

В процессе .NET-программирования нет необходимости создавать свой собственный WSDL-документ. Каждая web-служба .NET генерирует такой документ автоматически. Его можно увидеть с помощью поддерживающего XML браузера.

Некоторые разработчики утверждают, что стандарт WSDL для web-служб не нужен, поскольку сообщения SOAP являются самодостаточными и точно специфицируют типы данных любых содержащихся в них величин. Однако WSDL-документ предоставляет простой и последовательный способ задания разработчиком синтаксиса вызова любого web-метода. Более того, этот документ позволяет использовать инструменты автоматического генерирования прокси-классов, подобные включенным в среды Visual Studio .NET и .NET Framework. Благодаря указанным средствам использование web-службы является таким же простым, как и применение локального класса.

WSDL-документ имеет основанный на XML формат, в соответствии с которым информация подразделяется на пять групп. Первые три группы представляют собой абстрактные определения, не зависящие от особенностей платформы, сети или языка, а оставшиеся две группы включают конкретные описания.



Стандарт CORBA/IIOP


Модель CORBA является общим стандартом для создания брокеров объектных запросов ORB (Object Request Broker). Брокеры ORB служат для тех же целей, что и компоненты СОМ на платформе Microsoft, - они обеспечивают взаимодействие объектов. С появлением CORBA большинство разработчиков рассчитывали на то, что распределенная среда компьютерной обработки DCE (Distributed Computing Environment) станет основным сетевым протоколом, как это было с DCOM. Вместо этого был создан протокол IIOP, который определял способ коммуникации брокеров ORB по сети. Различные коммуникационные уровни в системе, основанной на CORBA, показаны на рис. 12.2.

По многим параметрам CORBA кажется идеальным средством для работы с распределенными объектами. Об этом свидетельствует, в частности, тот факт, что данная технология поддерживается внушительной группой разработчиков, включающей более 500 компаний-партнеров. Но все они и несут ответственность за снижение интереса к модели CORBA. Имеется множество реализаций CORBA, и все они обладают своими особенностями. Не существует коммерческих брокеров ORB, получивших столь широкое распространение, как компоненты СОМ компании Microsoft, и имеющих такую же, как у них, производительность.


Рис. 12.2.  Архитектура CORBA/IIОР



Стандарт DISCO


Стандарт DISCO предоставляет простейший способ получения доступа к файлам манифестов, позволяющий группировать ссылки на web-службы. Поскольку основной целью web-служб является обеспечение В2В-взаимодействия, требуется такой инструмент, который давал бы возможность не только создавать полезные функции, но и использовать их совместно с другими организациями. Информация о коммуникации с единственной web-службой может быть достаточно простой, но если у вас имеется сложная комбинация web-служб, которые расположены в различных приложениях ASP .NET и предназначены для различных клиентов, намного сложнее уследить за тем, чтобы клиенты получили требуемую информацию.

Один из методов обеспечения связей с различными web-службами состоит в создании специальной HTML-страницы. Однако такой подход не стандартизирован, требует формирования базового пользовательского интерфейса и может сбить с толку потребителей, которые просматривают web-узел. Возможны другие способы обмена информацией, в частности посредством электронной почты или телефона, но такие методы неэффективны.

Технология DISCO позволяет избежать данных проблем. DISCO-файл - это не просто список web-служб и соответствующих связей, представленных в XML-формате. Такой файл может включать файлы различных web-серверов и поддерживает "динамический поиск" - автоматический поиск каталога файлов web-службы на сервере. Инструменты .NET, например Visual Studio .NET, содержат средства обработки файлов манифестов и предоставляют простой способ их просмотра, а также обеспечивают подключение группы связанных служб к клиенту.

Чтобы использовать web-службу, клиенту необходимо знать адрес web-узла соответствующей компании либо адрес URL файла манифеста. Файлы манифеста полезны тем, что объединяют множество web-служб в единственном списке, однако они не позволяют клиентам отыскивать web-службы определенного типа без указания наименования компании-разработчика.



Стандарт Java RMI


Протокол CORBA быстро теряет репутацию, становясь все более сложным и неудобным для программирования. Частично в ответ на это компания Sun создала свой собственный механизм ORB, названный RMI (Remote Method Invocation - удаленный вызов метода). Данный механизм особенно эффективен при программировании на Java, поскольку прекрасно интегрируется с ним. Однако подобное интегрирование также является и недостатком. Работа RMI зависит от многих уникальных особенностей языка Java, ни одна из которых не поддерживается популярными языками наподобие C++. Фактически RMI - не конкурент даже CORBA.



Web-ориентированные приложения


С недавних пор настольные и web-приложения стали похожи друг на друга. Интерфейсы настольных приложений, например таких, как в системе Windows ХР, теперь напоминают интерфейсы интернет-браузеров. В обычных настольных приложениях применяются функции Интернета, а Windows-приложения способны взаимодействовать с web-серверами посредством протокола HTTP. В частности, программа Microsoft Money автоматически загружает банковскую информацию; операционная система Windows уведомляет вас о появляющихся обновлениях; Visual Studio .NET позволяет проводить поиск в библиотеке MSDN, не покидая среду разработки.

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

С появлением web-служб и технологии .NET ситуация изменилась. Протоколы web-служб определяют структуру для предоставления функций через Интернет. Они основаны на открытых стандартах, являются взаимосвязанными, расширяемыми и используются для нынешнего поколения web-ориентированных приложений. Система .NET Framework представляет собой высокооптимизированную платформу и имеет набор инструментов для развертывания web-служб.



Web-службы конкурирующих фирм-производителей


Microsoft - не единственный разработчик инструментов реализации web-служб. В настоящее время существуют инструменты создания web-служб для разнообразных языков и платформ. Некоторые из них перечислены ниже.

Компания IBM предоставляет набор средств разработки Web Service Developinent Kit, содержащий среду выполнения и многочисленные примеры.Компания Oracle предлагает специальный язык для разработки web-служб Web Integration Development Language, а также собственные web-службы.Компания Sun Microsystems предоставляет среду Sun ONE (Open Net Environment), поддерживающую web-службы, написанные на языке Java.Набор SOAP Toolkit от Microsoft позволяет вызывать web-службы из программных продуктов, созданных в предыдущих версиях Microsoft Visual Studio (и написанных на таких языках, как Visual Basic и C++).Программа Internet Explorer версии 5 и более поздних дает возможность вызывать web-службы с web-страниц посредством простого сценарного кода. Эта технология носит название WebService Behavior.Язык Perl включает набор инструментов SOAP::Lite для работы с базовыми функциями SOAP.



XML-RPC


XML-RPC - это простой, но довольно распространенный протокол, который является предшественником протокола SOAP и web-служб .NET. Протокол RPC (Remote Procedure Call - вызов удаленной процедуры) обеспечивает вызовы удаленных процедур путем отправки запросов в виде XML-документов и получение ответа в другом XML-документе. Таким же образом работает и web-служба .NET, но для связи с ней необходим протокол SOAP.

Протокол XML-RPC имеет некоторые ограничения, главным из которых является отсутствие поддержки типов данных. Технология web-служб .NET вобрала в себя лучшее качество XML-RPC, то есть тот факт, что программы могут взаимодействовать, если они обмениваются сообщениями, имеющими стандартный согласованный формат. Кроме того, при разработке web-служб .NET были учтены потребности промышленности в необходимости кросс -платформенного представления данных различных типов.



Клиентская часть


Для создания клиентского приложения нужно для начала создать новый проект. Для этого следует выполнить команду меню File | New | Project. В появившемся диалоговом окне New Project в наборе Templates выбрать шаблон Windows Application и в поле Name указать наименование создаваемого приложения.

После этого Visual Studio .NET создаст форму с именем Form1, устанавливаемым по умолчанию. В окне этой формы нам потребуется разместить один элемент Checkbox, одно текстовое поле Label, и одну кнопку Button. При помощи независимого переключателя CheckBox1 мы будем задавать параметр, передаваемый функции MyDate, входящей в состав сервиса. Текстовое поле будет содержать результат, возвращаемый этой функцией, а кнопка - запускать процесс установки связи с Web-сервисом и получения от него требуемых данных.

После этого следует установить связь с искомым Web-сервисом. Для этого надо в окне Solution Explorer выбрать наименование создаваемого приложения и правым щелчком мыши вызвать для него контекстное меню. В этом контекстном меню необходимо выполнить команду Add Web Reference, после чего будет активизировано одноименное диалоговое окно, позволяющее установить ссылки на используемые сервисы.

Для того чтобы получить ссылки на функции Web-сервиса и перенести их в проект, нужно в текстовом поле Address указать URL необходимого сервиса и загрузить ресурс, располагающийся по этому адресу. После этого в левой части искомого окна Add Web Reference будет отображено содержимое стартовой Web-страницы.


После того как искомые ссылки на функции Web-сервиса будут найдены, при помощи кнопки Add Reference их необходимо добавить к разрабатываемому проекту. После чего можно обращаться к функциям Web-сервиса в приложении (функция Button_Click).

Public Class Form1 Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New() MyBase.New()

'This call is required by the Windows Form Designer. InitializeComponent()

'Add any initialization after the InitializeComponent() call


End Sub

' Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub

'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox Friend WithEvents Label1 As System.Windows.Forms.Label Friend WithEvents Button1 As System.Windows.Forms.Button <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.CheckBox1 = New System.Windows.Forms.CheckBox() Me.Label1 = New System.Windows.Forms.Label() Me.Button1 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'CheckBox1 ' Me.CheckBox1.Location = New System.Drawing.Point(16, 16) Me.CheckBox1.Name = "CheckBox1" Me.CheckBox1.Size = New System.Drawing.Size(168, 24) Me.CheckBox1.TabIndex = 0 Me.CheckBox1.Text = "Отображать время" ' 'Label1 ' Me.Label1.Location = New System.Drawing.Point(16, 64) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(264, 23) Me.Label1.TabIndex = 1 ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(16, 128) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(256, 32) Me.Button1.TabIndex = 2 Me.Button1.Text = "Запуск Web-сервиса" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1, Me.Label1, Me.CheckBox1}) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim t1 = New WindowsApplication1.localhost.Service1() Label1.Text = t1.MyDate(CheckBox1.Checked) End Sub End Class

Листинг 13.1.

После запуска приложение будет выглядеть следующим образом:




Контрольные вопросы:


Web- службы. Основные понятия. Назначение.История развития Web-служб. Модель COM/DCOM. .Стандарт CORBA/IIOP. Недостатки перечисленных технологий.Web-службы .Net. Достоинства. Архитектура.

<

Windows Form Designer generated code


Public Class Form1 Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New() MyBase.New()
'This call is required by the Windows Form Designer. InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub
'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox Friend WithEvents Label1 As System.Windows.Forms.Label Friend WithEvents Button1 As System.Windows.Forms.Button <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.CheckBox1 = New System.Windows.Forms.CheckBox() Me.Label1 = New System.Windows.Forms.Label() Me.Button1 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'CheckBox1 ' Me.CheckBox1.Location = New System.Drawing.Point(16, 16) Me.CheckBox1.Name = "CheckBox1" Me.CheckBox1.Size = New System.Drawing.Size(168, 24) Me.CheckBox1.TabIndex = 0 Me.CheckBox1.Text = "Отображать время" ' 'Label1 ' Me.Label1.Location = New System.Drawing.Point(16, 64) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(264, 23) Me.Label1.TabIndex = 1 ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(16, 128) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(256, 32) Me.Button1.TabIndex = 2 Me.Button1.Text = "Запуск Web-сервиса" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1, Me.Label1, Me.CheckBox1}) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim t1 = New WindowsApplication1.localhost.Service1() Label1.Text = t1.MyDate(CheckBox1.Checked) End Sub End Class
Листинг 13.1.
Закрыть окно



Сервис


Для того чтобы создать самый простой Web-сервис, который по запросу пользователя будет выдавать текущую дату или комбинацию даты и времени в среде разработки Visual Studio .NET следует выполнить команду меню File | New | Project и в появившемся диалоговом окне New Project в наборе Templates выделить значок ASP.NET Web Service. В поле Name следует указать наименование создаваемого проекта. После того, как все необходимые приготовления средой разработки будут сделаны, на основном рабочем поле появятся две новые страницы. Одна будет предназначена для разработки визуального дизайна, а на второй будет располагаться код нашего сервиса. Естественно, у создаваемого сервиса не может быть внешнего вида как такового, ему нечего отображать, поэтому страницу для дизайна можно спокойно закрыть.

В состав одного проекта может входить несколько отдельных сервисов. Для нашего примера потребуется всего один Web-сервис, заготовка для которого создается средой разработки Visual Studio. NET автоматически, поэтому ничего изменять не потребуется, и мы можем сразу перейти на страницу с наименованием Service1.asmx.vb. На этой странице нужно разместим код нашего Web-сервиса:

Imports System.Web.Services

<WebService(Namespace := "http://tempuri.org/")> _ Public Class Service1 Inherits System.Web.Services.WebService

#Region " Web Services Designer Generated Code "

Public Sub New() MyBase.New()

'This call is required by the Web Services Designer. InitializeComponent()

'Add your own initialization code after the InitializeComponent() call

End Sub

'Required by the Web Services Designer Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Web Services Designer 'It can be modified using the Web Services Designer. 'Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() components = New System.ComponentModel.Container() End Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) 'CODEGEN: This procedure is required by the Web Services Designer 'Do not modify it using the code editor.
If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub

#End Region

<WebMethod()> Public Function MyDate(ByVal ShowTime As Boolean ) As String Dim MD As DateTime If ShowTime Then MyDate = MD.Now Else MyDate = MD.Today End If End Function

End Class

Из всего этого кода лишь малая часть написана разработчиком. Это функция MyDate, расположенная в конце листинга.

После компиляции к созданному Web сервису можно обратиться даже из браузера. На рис. приведен внешний вид Web-страницы, которая генерируется Web-сервером при попытке обращения к Web сервису.



На этой Web-странице расположена ссылка на формальное описание структуры Web-сервиса, а также перечислены все функции, поддерживаемые Web-сервисом. В нашем случае, естественно, указана лишь одна функция MyDate. Наименование функции также является гиперссылкой, нажав на которую можно перейти к Web-странице, позволяющей воспользоваться этой функцией. После щелчка мышью на ссылке в браузере будет отображена Web-страница следующего вида



На этой странице расположено поле ввода, в котором пользователь может указать значение параметра, передаваемого функции.

В результате работы функции сервиса получим:

<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://tempuri.org/">11.08.2006 23:03:54</string>


Содержание работы


Изучить основные принципы создания Web-сервисов.Создать web-сервис, который будет использовать XML документ в качестве источника данных. То есть создать Web- сервис, возвращающий обычный набор данных содержащий информацию, взятую из XML-файла.Дополнить созданный web- сервис процедурой позволяющей сохранять данные в XML файле. Создать клиентское приложение.Оформить отчет, включающий постановку задачи, текст программ, демонстрацию работы программ.Защитить лабораторную работу



XML-документ в качестве источника данных


Создадим Web-сервис, который будет включать единственную функцию, возвращающую обычный набор данных (DataSet), содержащий информацию, взятую из XML-файла.

Для этого создадим новый проект Web-сервиса. На его страницу отбуксируем один компонент DataSet с вкладки Data. При этом будет актировано диалоговое окно AddDataset, в котором разработчику предлагается указать тип создаваемого набора данных. Так как в нашем случае XML-файл может содержать данные любой структуры, то для набора данных нельзя заранее указать структуру. Следовательно, в этом диалоговом окне разработчик должен выбрать переключатель Untyped dataset.

Код Web-сервиса приведен ниже.

Imports System.Web.Services

<WebService(Namespace := "http://tempuri.org/")7> _ Public Class Service1 Inherits System.Web.Services.WebService

#Region " Web Services Designer Generated Code "

Public Sub New() MyBase.New()

'This call is required by the Web Services Designer. InitializeComponent()

'Add your own initialization code after the InitializeComponent() call

End Sub

'Required by the Web Services Designer Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Web Services Designer 'It can be modified using the Web Services Designer. 'Do not modify it using the code editor. Friend WithEvents DataSet1 As System.Data.DataSet <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.DataSet1 = New System.Data.DataSet() CType(Me.DataSet1, System.ComponentModel.ISupportInitialize).BeginInit() ' 'DataSet1 ' Me.DataSet1.DataSetName = "NewDataSet" Me.DataSet1.Locale = New System.Globalization.CultureInfo("ru-RU") CType(Me.DataSet1, System.ComponentModel.ISupportInitialize).EndInit()

End Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) 'CODEGEN: This procedure is required by the Web Services Designer 'Do not modify it using the code editor. If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub


#End Region

<WebMethod()> Public Function XMLData( ByVal file As String) As DataSet Dim FS As IO.FileStream Dim Reader As IO.StreamReader FS = New IO.FileStream(Server.MapPath(file), IO.FileMode.Open, IO.FileAccess.Read) Reader = New IO.StreamReader(FS) DataSet1.ReadXml(Reader) FS.Close() XMLData = DataSet1 End Function

End Class

Листинг 13.2.

Если содержимое XML-файла, используемого в нашем примере, будет выглядеть следующим образом:

<Document> <Row><Document> <Row> <Columnl>l</Columnl> <Column2>2</Column2> <Column3>Textl</Column3> <Column4>Text2</Column4> </Row> <Row> <Columnl>3</Columnl> <Column2>4</Column2> <Column3>Text3</Column3> <Column4>Text4</Column4> </Row> </Document>, <Columnl>l</Columnl> <Column2>2</Column2> <Column3>Textl</Column3> <Column4>Text2</Column4> </Row> <Row> <Columnl>3</Columnl> <Column2>4</Column2> <Column3>Text3</Column3> <Column4>Text4</Column4> </Row> </Document>,

то в результате работы данного Web- сервиса мы получим:

<?xml version="1.0" encoding="utf-8" ?> - <DataSet xmlns="http://tempuri.org/"> - <xs:schema id="Document" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xs:element name="Document" msdata:IsDataSet="true" msdata:Locale="ru-RU"> - <xs:complexType> - <xs:choice maxOccurs="unbounded"> - <xs:element name="Row"> - <xs:complexType> - <xs:sequence> <xs:element name="Columnl" type="xs:string" minOccurs="0" /> <xs:element name="Column2" type="xs:string" minOccurs="0" /> <xs:element name="Column3" type="xs:string" minOccurs="0" /> <xs:element name="Column4" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> - <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> - <Document xmlns=""> - <Row diffgr:id="Row1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> <Columnl>l</Columnl> <Column2>2</Column2> <Column3>Textl</Column3> <Column4>Text2</Column4> </Row> - <Row diffgr:id="Row2" msdata:rowOrder="1" diffgr:hasChanges="inserted"> <Columnl>3</Columnl> <Column2>4</Column2> <Column3>Text3</Column3> <Column4>Text4</Column4> </Row> </Document> </diffgr:diffgram> </DataSet>



Листинг 13.3.

Для создания клиентского приложения нужно для начала создать новый проект. Для этого как и в предыдущем примере следует выполнить команду меню File | New | Project. В появившемся диалоговом окне New Project в наборе Templates выбрать шаблон Windows Application и в поле Name указать наименование создаваемого приложения.

После этого Visual Studio .NET создаст форму с именем Form1, устанавливаемым по умолчанию. В окне этой формы нам потребуется разместить один элемент TextBox, одно текстовое поле Label, одну кнопку Button, один компонент DataGrid, и один компонент DataSet с вкладки Data. Пример формы приведен ниже.



После этого следует установить связь с искомым Web-сервисом. Для этого надо в окне Solution Explorer выбрать наименование создаваемого приложения и правым щелчком мыши вызвать для него контекстное меню. В этом контекстном меню необходимо выполнить команду Add Web Reference, после чего будет активизировано одноименное диалоговое окно, позволяющее установить ссылки на используемые сервисы.

Для того чтобы получить ссылки на функции Web-сервиса и перенести их в проект, нужно в текстовом поле Address указать URL необходимого сервиса и загрузить ресурс, располагающийся по этому адресу. После этого в левой части искомого окна Add Web Reference будет отображено содержимое стартовой Web-страницы.



После того как искомые ссылки на функции Web-сервиса будут найдены, при помощи кнопки Add Reference их необходимо добавить к разрабатываемому проекту. После чего можно обращаться к функциям Web-сервиса в приложении (функция Button_Click).

Public Class Form1 Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New() MyBase.New()

'This call is required by the Windows Form Designer. InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub



' Required by the Windows Form Designer Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents TextBox1 As System.Windows.Forms.TextBox Friend WithEvents Label1 As System.Windows.Forms.Label Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid Friend WithEvents DataSet1 As System.Data.DataSet <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() Me.TextBox1 = New System.Windows.Forms.TextBox() Me.Label1 = New System.Windows.Forms.Label() Me.Button1 = New System.Windows.Forms.Button() Me.DataGrid1 = New System.Windows.Forms.DataGrid() Me.DataSet1 = New System.Data.DataSet() CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DataSet1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'TextBox1 ' Me.TextBox1.Location = New System.Drawing.Point(56, 24) Me.TextBox1.Name = "TextBox1" Me.TextBox1.Size = New System.Drawing.Size(224, 20) Me.TextBox1.TabIndex = 0 Me.TextBox1.Text = "TextBox1" ' 'Label1 ' Me.Label1.Location = New System.Drawing.Point(8, 24) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(48, 23) Me.Label1.TabIndex = 1 Me.Label1.Text = "Файл" ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(16, 56) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(264, 24) Me.Button1.TabIndex = 2 Me.Button1.Text = "Получить данные" ' 'DataGrid1 ' Me.DataGrid1.DataMember = "" Me.DataGrid1.DataSource = Me.DataSet1 Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText Me.DataGrid1.Location = New System.Drawing.Point(16, 88) Me.DataGrid1.Name = "DataGrid1" Me.DataGrid1.Size = New System.Drawing.Size(264, 80) Me.DataGrid1.TabIndex = 3 ' 'DataSet1 ' Me.DataSet1.DataSetName = "NewDataSet" Me.DataSet1.Locale = New System.Globalization.CultureInfo("ru-RU") ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.DataGrid1, Me.Button1, Me.Label1, Me.TextBox1}) Me.Name = "Form1" Me.Text = "Form1" CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.DataSet1, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim xml = New WindowsApplication2.localhost.Service1() DataSet1.Merge(xml.XMLData(TextBox1.Text)) End Sub End Class

Листинг 13.4.

После запуска приложение будет выглядеть следующим образом:




ATTLIST university nameU ID


1. Дано DTD:

<!DOCTYPE base_of_students [ <!ELEMENT base_of_students (university+)> <!ELEMENT university (student+)> <! ATTLIST university nameU ID #REQUIRED> <!ELEMENT student (name,course,group,mark,form,faculty,adress)> <!ELEMENT name (surname,first,second)> <!ELEMENT surname (#PCDATA)> <!ELEMENT first (#PCDATA)> <!ELEMENT second (#PCDATA)> <!ELEMENT course (#PCDATA)> <!ELEMENT group (#PCDATA)> <!ELEMENT mark (#PCDATA)> <!ELEMENT form (#PCDATA)> <!ELEMENT fuculty (#PCDATA)> <!ELEMENT adress (#PCDATA)> ] >

Написать соответствующий данному DTD XML-файл.

2. Дан XML-файл:

<?xml version="1.0" encoding="windows-1251" ?> <?xml-stylesheet type='text/xsl' href=7apos;1.xsl'?> <documents> <book> <title>Языки информационного обмена </title> <type> Лекции </type> <file>Лекции ЯИО.doc</file> </book> <book> <title>Языки информационного обмена </title> <type>Лабораторные работы</type> <file>Лабораторные работы ЯИО.doc</file> </book> <book> <title>Администрирование ИС</title> <type>Лекции</type> <file>Лекции АИС.doc</file> </book> <book> <title>Администрирование ИС</title> <type>Лабораторные работы</type> <file>Лабораторные работы АИС.doc</file> </book> </documents>

Написать файл 1.xsl для отображения содержимого XML-файла. Содержимое тега <file> должно отображаться как ссылка.


xsl для отображения содержимого


1. Дана часть схемы документа:

<xs:element name="adress" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="city" type="xs:string" minOccurs="0" /> <xs:element name="street" type="xs:string" minOccurs="0" /> <xs:element name="house" type="xs:string" minOccurs="0" /> <xs:element name="zip" type="xs:string" minOccurs="0" /> <xs:element name="phone-list" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="phone" nillable="true" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:simpleContent msdata:ColumnName="phone_Text" msdata:Ordinal="0"> <xs:extension base="xs:string"></xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>

Написать фрагмент XML-файла удовлетворяющий данному фрагменту.

2. Дан XML-файл:

<?xml version="1.0" encoding="windows-1251" ?> <?xml-stylesheet type='text/xsl' href='1.xsl'?> <documents> <book> <title>Языки информационного обмена </title> <type> Лекции </type> <file> <id>1</id> <name>Лекции ЯИО.doc</name> </file> </book> <book> <title>Языки информационного обмена </title> <type>Лабораторные работы</type> <file> <id>3</id> <name> Лабораторные работы ЯИО.doc </name> </file> </book> <book> <title>Администрирование ИС</title> <type>Лекции</type> <file> <id>2</id> <name>Лекции АИС.doc</name> </file> </book> <book> <title>Администрирование ИС</title> <type>Лабораторные работы</type> <file> <id>4</id> <name> Лабораторные работы АИС.doc </name> </file>

</book> </documents>

Написать файл 1. xsl для отображения содержимого XML-файла. Содержимое тега <file> должно только в случае если id<3.


отображается только содержимое тега


1. Дано DTD:

<!DOCTYPE notebook [ <!ELEMENT notebook (person+)> <!ELEMENT person (name, birthday?, address*, phone-list)> <!ELEMENT name EMPTY> <!ATTLIST name first CDATA #IMPLIED second CDATA #IMPLIED surname CDATA #REQUIRED> <!ELEMENT birthday (#PCDATA)> <!ELEMENT address (street,city,zip)?> <!ELEMENT street (#PCDATA)> <!ELEMENT city (#PCDATA)> <!ATTLIST city type (город | поселок | деревня) "город"> <!ELEMENT zip (#PCDATA)> <!ELEMENT phone-list (work-phone*, home-phone*)> <!ELEMENT work-phone (#PCDATA)> <!ELEMENT home-phone (#PCDATA)> ] >

Написать соответствующий данному DTD XML-файл.

2. Дан XML-файл:

<?xml version="1.0" encoding="windows-1251" ?> <?xml-stylesheet type='text/xsl' href='1.xsl'?> <documents> <book> <title>Языки информационного обмена </title> <type> Лекции </type> <file> <id>1</id> <name1>Лекции ЯИО.doc</name1> <name2>Лекции ЯИО.html</name2> </file> </book> <book> <title>Языки информационного обмена </title> <type>Лабораторные работы</type> <file> <id>3</id> <name1> Лабораторные работы ЯИО.doc </name1> <name2> Лабораторные работы ЯИО.html </name2> </file> </book> <book> <title>Администрирование ИС</title> <type>Лекции</type> <file> <id>2</id> <name1>Лекции АИС.doc</name1> <name2>Лекции АИС.html</name2>

</file> </book> <book> <title>Администрирование ИС</title> <type>Лабораторные работы</type> <file> <id>4</id> <name1> Лабораторные работы АИС.doc </name1> <name2> Лабораторные работы АИС.html </name2> </file>

</book> </documents>

Написать файл 1.xsl для отображения содержимого XML-файла. Содержимое тега <file> отображается следующим образом: если id> 3 отображается только содержимое тега <name1>, если id=3 отображается только содержимое тега <name2>, если id>3 отображается содержимое тегов <name1> и <name2>.


Дана часть схемы


1. Дана часть схемы документа:

<xs:element name="good" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="description" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="model" type="xs:string" minOccurs="0" /> <xs:element name="parametrs" type="xs:string" minOccurs="0" /> <xs:element name="price" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="name" form="unqualified" type="xs:string" /> </xs:complexType> </xs:element>

Написать фрагмент XML-файла удовлетворяющий данному фрагменту.

2. Дан XML-файл:

<?xml version="1.0" encoding="windows-1251" ?> <documents> <book> <title>Языки информационного обмена </title> <type> Лекции </type> <file>Лекции ЯИО.doc</file> </book> <book> <title>Языки информационного обмена </title> <type>Лабораторные работы</type> <file>Лабораторные работы ЯИО.doc</file> </book> <book> <title>Администрирование ИС</title> <type>Лекции</type> <file>Лекции АИС.doc</file> </book> <book> <title>Администрирование ИС</title> <type>Лабораторные работы</type> <file>Лабораторные работы АИС.doc</file> </book> </documents>

Отобразить содержимое XML-файла используя интерфейсы DOM.


xsl для отображения содержимого


1. Дана часть схемы документа:

<xs:element name="student" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="name"> <xs:complexType> <xs:sequence> <xs:element name="surname" type="xs:string" /> <xs:element name="first" type="xs:string" /> <xs:element name="second" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="faculty" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> <xs:element name="group" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element>

Написать фрагмент XML-файла удовлетворяющий данному фрагменту.

2. Дан XML-файл:

<?xml version="1.0" encoding="windows-1251" ?> <?xml-stylesheet type='text/xsl' href='1.xsl'?> <documents> <book> <title>Языки информационного обмена </title> <type> Лекции </type> <file>Лекции ЯИО.doc</ file > < file >Лекции ЯИО.pdf</ file > < file >Лекции ЯИО.html</ file > </book> <book> <title>Языки информационного обмена </title> <type>Лабораторные работы</type> < file > Лабораторные работы ЯИО.doc </file > < file > Лабораторные работы ЯИО.html </ file > </book> </documents>

Написать файл 1. xsl для отображения содержимого XML-файла в следующем виде:

<