Знакомство с Microsoft .NET Framework 2.0

Часть 5. XML .NET и Web-сервисы 2.0

Алексей Федоров

Поддержка Xml в версии 1.0

На пути к версии 2.0

   Повышение производительности

XML .NET 2.0

   Статические методы Create и конфигурационные классы

   Поддержка XML-стандартов

   Поддержка и преобразование универсальных типов

   Расширенные методы классов XmlReader и XmlWriter

   Язык XQuery

   Безопасность

   Облегченные запросы XPath с использованием пространств имен

   Класс XPathDocument и DOM

Расширенная поддержка Web-сервисов в .NET Framework 2.0

Заключение

 

Об авторе. Алексей Федоров — сотрудник отдела стратегических технологий российского представительства компании Microsoft (alexeif@microsoft.com).

В предыдущих частях этой статьи (см. № 10, 12’2004, 1, 3’2005) мы рассмотрели общие вопросы, а также рассказали о новшествах в технологиях создания Windows-приложений (Windows Forms 2.0), Web-приложений (ASP .NET 2.0) и о технологии доступа к данным ADO .NET 2.0. В этом номере мы остановимся на изменениях, связанных с использованием языка XML в приложениях, создаваемых на платформе Microsoft .NET, а также рассмотрим некоторые новинки, появившиеся в поддержке создания Web-сервисов.

Классы, позволяющие .NET-приложениям работать с XML-документами, расположены в пространстве имен System.Xml и в дочерних пространствах имен System.Xml.Query, System.Xml.Schema, System.XmlSerialization, System.Xml.XPath и System.Xml.Xsl.

Поддержка Xml в версии 1.0

При работе над поддержкой XML на уровне библиотеки классов Microsoft .NET Framework версии 1.0 разработчики ставили своей целью обеспечить соответствие базовым стандартам комитера W3C, позволяющим обеспечивать кроссплатформенное взаимодействие на уровне языка Xml. Эти стандарты включают Xml 1.0, Xml Namespaces 1.0, Xslt 1.0, XPath 1.0 и W3C Xml Schema 1.0.

Помимо этого в версии 1.0 был реализован простой и интуитивно понятный набор программных интерфейсов для работы с XML-документами и данными. Была также обеспечена интеграция с технологией доступа к данным ADO .NET, что позволило разработчикам использовать и реляционные источники данных, и XML-данные, например на уровне набора данных (DataSet).

В версии 1.0 была заложена основа расширяемости классов, связанных с обработкой XML-данных на уровне ряда абстрактных классов: XmlReader, XmlWriter и XmlPathNavigator. Класс XmlPathNavigator представляет особый интерес, так как объединяет произвольный доступ к данным, доступ с использованием курсоров и поддержку запросов на уровне стандарта XPath.

В начало В начало

На пути к версии 2.0

Задачи, которые были поставлены при разработке версии 1.0, особенно в части поддержки основных стандартов комитера W3C, остались актуальными и в версии 2.0. Кроме того, появилась задача повышения производительности работы основных механизмов, реализованных в пространстве имен System.Xml, а также потребовалось внести ряд расширений и дополнений.

Повышение производительности

Когда несколько лет назад создавалась первая версия библиотеки классов .NET Framework, никто не мог предположить, что технологии, связанные с поддержкой XML, будут использоваться для работы с представлениями структурированных данных, например для работы с информацией, хранящейся в базах данных или в наборах данных. Таким образом, XML все чаще и чаще используется на среднем слое многослойных приложений, предоставляя распределенным приложениям механизм для хранения, передачи и обработки данных. Это означает, в частности, что базовая поддержка XML на уровне библиотеки классов должна обеспечивать высокую производительность. Тесты, проведенные Microsoft в рамках работы над .NET Framework 2.0, показывают, что производительность основных операций над XML-данными — обработки, записи и преобразования — значительно повысилась. Приведем лишь некоторые цифры, подтверждающие это:

  • производительность XmlTextReader/XmlTextWriter увеличилась в 2 раза по сравнению с версией 1.1;
  • экземпляры класса XmlReader, созданные через статический метод Create, обладают той же производительностью, что и типы, созданные с помощью конструкторов, так как для их реализации используется та же самая кодовая база;
  • экземпляры класса XmlWriter, созданные через статический метод Create, более производительны, чем экземпляры класса XmlTextWriter;
  • проверка схемы XML Schema стала в среднем на 20% быстрее и теперь больше соответствует стандарту W3C;
  • производительность XSLT-преобразований повысилась в 3-4 раза.

Теперь рассмотрим эти и другие изменения в XML .NET 2.0 более подробно.

В начало В начало

XML .NET 2.0

Статические методы Create и конфигурационные классы

Вышеупомянутые статические методы Create классов XmlReader и XmlWriter должны использоваться в большинстве ситуаций, связанных с созданием экземпляров этих классов, облегчить выбор класса, который предполагается использовать (например, между XmlConformantReader, XsdValidatingReader и т.п.), а также упростить конфигурацию, поскольку и конкретный тип класса, и его настройки определяются подсистемой поддержки XML автоматически. Кроме того, применение статических методов позволяет программно объединять вывод класса XmlReader с вводом класса XmlWriter и таким образом легче решать задачи, связанные, в частности, с проверкой на основании схем, с удалением лишних пробелов из результирующего XML-документа и т.п.

При применении статических методов Create классов XmlReader и XmlWriter конфигурационные опции задаются через классы XmlReaderSettings и XmlWriterSettings. К конфигурационным опциям относятся, например, XSD-схемы для проведения проверки, учет или игнорирование пробелов, способ вывода с использованием символов новой строки и пр. Конфигурационные классы связаны с классами XmlReader и XmlWriter через метод Create последних, а потому в приложениях можно использовать заранее созданные конфигурационные классы для создания нескольких экземпляров классов XmlReader и XmlWriter.

Поддержка XML-стандартов

По умолчанию классы XmlTextReader и XmlTextWriter не соответствуют спецификации XML 1.0, поэтому появление статических методов Create для классов XmlReader и XmlWriter обеспечивает более высокую поддержку необходимых стандартов. Так, у класса XmlTextReader отсутствуют поддержка DTD и возможность разрешения ссылок внутри XML-документа, в связи с чем для обеспечения необходимой функциональности программистам приходилось использовать этот класс с определенными настройками. Теперь класс XmlTextReader поддерживает и DTD, и возможность разрешения ссылок внутри XML-документа, что делает этот класс полноценным XML-парсером, соответствующим всем необходимым стандартам.

Экземпляры, возвращаемые статическими методами Create классов XmlReader и XmlWriter, по умолчанию полностью соответствуют стандартам. Экземпляр класса XmlReader по умолчанию имеет уровень поддержки ConformanceLevel со значением Document, а это значит, что он пытается читать поданный на вход XML-файл как XML-документ. Можно также присвоить уровню поддержки значение Auto — в этом случае XmlReader будет читать XML либо как документ, либо как фрагмент, в зависимости от структуры XML-файла и от узлов, которые будут в нем обнаружены.

Уровень поддержки и необходимость использования DTD задаются через класс конфигурации XmlReaderSettings.

К новшествам класса XmlWriter, реализованным через статический метод Create, можно отнести автоматическую проверку использования символов, не поддерживаемых на уровне стандарта XML 1.0. Подобная проверка происходит для имен элементов, атрибутов, пространств имен, а также для всего содержимого XML-документа.

Поддержка и преобразование универсальных типов

Классы XmlReader, XmlWriter, XPathNavigator теперь поддерживают использование XML Schema для преобразования типов (из XML Schema в CLR-типы). Этой функциональности можно было достичь и в версии 1.0, но более сложным путем — используя классы XmlValidatingReader и XmlConvert.

В версии 2.0 у класса XmlReader появился ряд методов ReadValueAsXXX, с помощью которых можно считывать и преобразовывать данные за один вызов метода. Эти методы подходят и для преобразования значений атрибутов.

Класс XmlWriter пополнился поддержкой преобразования CLR-типов в типы, определенные в XML Schema, — для этих целей служит метод WriteValue.

Расширенные методы классов XmlReader и XmlWriter

Классы XmlReader и XmlWriter пополнились вспомогательными методами, представленными в таблице.

 

Расширенные методы классов XmlReader и XmlWriter

Расширенные методы классов XmlReader и XmlWriter

Язык XQuery

На данный момент XML поддерживает два языка запросов — XPath 1.0 и XSLT 1.0. Язык XSLT позиционируется для преобразования XML-документов, но также может использоваться для выполнения запросов к XML-документам. Относительно недавно комитет W3C решил создать еще один язык запросов — XQuery (см. спецификацию на сайте http://www.w3c.org/TR/xquery), одной из задач которого является упрощение механизма запросов к XML-документам независимо от того, сохранены ли эти документы физически или предоставлены какими-то программными компонентами. Предполагается, что XQuery будет играть такую же роль для XML-документов, какую язык SQL играет для реляционных баз данных.

Поддержка языка XQuery реализована в .NET Framework 2.0 на базе класса XQueryCommand, который находится в пространстве имен System.Xml.Query. Запросы XQuery компилируются с помощью метода Compile, который выполняет проверку типов и создает промежуточный код. Метод Execute обеспечивает выполнение запроса и при необходимости может сгенерировать результирующий документ (это зависит от типа запроса), используя класс XmlWriter.

Безопасность

Работа над повышением безопасности ведется постоянно. Так, в .NET Framework 1.1 был запрещен саб-классинг XmlTextReader для кода со статусом semi-trusted и был реализован класс XmlSecureUriResolver с целью ограничения доступа к ресурсам, запрещенным через policy.

В версии 2.0 существенным добавлением стала возможность рассматривать XML с теми же привилегиями безопасности, что и код, — за счет применения к нему механизмов .NET Code Access Security (CAS). В той же степени, в какой CAS применяется сейчас по отношению к загружаемому коду, в версии 2.0 CAS можно будет применить и к XML-данным, обеспечивая их безопасность. Например, при использовании XmlReader для загрузки XML-документа по адресу, описанному URL, этот URL (вместе с его компонентами host и site) используется как evidence для системы безопасности. Основываясь на установках policy, данная информация позволяет определить как уровень доверия к документу, так и действия, которые тот может выполнять. Если документ содержит ссылки на внешние элементы, то evidence используется для запрещения перенаправления запросов на сомнительные Web-узлы. Когда XML-документ представляет собой XSLT-трансформацию, он может содержать CLR-код (на C# или Visual Basic .NET), и в этом случае важно, чтобы был установлен контроль над областью доступа такого кода. В целях обеспечения вышеописанной функциональности класс XmlReader содержит свойство Evidence.

Вторым новшеством версии 2.0 стала возможность запрещения обработки DTD при загрузке XML-документа. Когда создавалась спецификация XML 1.0, вопросы обеспечения безопасности не являлись первоочередными, в результате чего DTD-документ может служить источником атак Denial of Service (DoS-атак), если, конечно, воспользоваться соответствующими функциями DTD. В версии 2.0 для защиты от DoS-атак предусмотрено свойство ProhibitDtd класса XmlReaderSettings, с помощью которого можно запретить обработку DTD: если это свойство установлено, то класс XmlReader будет генерировать исключение при обнаружении любого DTD-содержимого в XML-документе.

Облегченные запросы XPath с использованием пространств имен

Если класс XmlDocument используется для обработки XML-документов, то можно применять перегруженный метод SelectNodes, который позволяет указать пространство имен для отображения префиксов с помощью класса XmlNamespaceManager. Этот метод незаменим в тех случаях, когда требуется выполнение XPath-запросов к элементам XML-документа, содержащим префикс.

Класс XPathDocument и DOM

В версии 1.0 класс XPathDocument был построен на основе модели данных XPath с целью обеспечения быстрой отработки XSLT-запросов. В версии 2.0 XPathDocument является первичным хранилищем XML-документов и предполагатся его повсеместное использование при работе с документами. Поддержка DOM (класс XmlDocument) по-прежнему имеется, как и другие стандартные API, но необходимо помнить, что DOM никогда не разрабатывался как интерфейс, поддерживающий запросы XSLT, XPath или XQuery. В настоящее время наметилась устойчивая тенденция к использованию XML для представления и документов и данных, поэтому DOM API уже не подходит, особенно для решения задач, возникающих в корпоративных приложениях.

На этом мы завершим обзор новшеств XML .NET 2.0 и перейдем к расширениям в поддержке Web-сервисов в библиотеке .NET Framework 2.0.

В начало В начало

Расширенная поддержка Web-сервисов в .NET Framework 2.0

Поддержка Web-сервисов реализована в .NET Framework 2.0 в пространстве имен System.Web.Services и дочерних пространствах имен System.Web.Services.Configuration, System.Web.Services.Description, System.Web.Services.Discovery и System.Web.Services.Protocols. Инфраструктура Web-сервисов базируется на технологии ASP .NET и Internet Information Services (IIS).

Как известно, поддержка Web-сервисов на уровне .NET Framework обеспечивает реализацию базовых протоколов и технологий — SOAP (Simple Object Access Protocol), WSDL (Web Service Description Language) и UDDI (Universal Description, Discovery and Integration Protocol). Дальнейшие расширения Web-сервисов, уже разработанные и разрабатываемые сегодня различными организациями (см. об этом в статье «Web-службы вчера, сегодня, завтра» № 2’2005), реализуются через набор бесплатных дополнений под названием Web Services Enhancements, которые доступны для загрузки с Web-сайта компании Microsoft (http://msdn.microsoft.com/webservices/downloads/default.aspx).

WSE может использоваться как отдельно, так и для расширения функциональности ASXM-сервисов (через пре- и постпроцессинг на базе SoapExtension). Планируется полноценная поддержка .NET Framework 2.0 в WSE 2.0, а также полная интеграция с ASMX с выпуском WSE 3.0.

В основном дополнения касаются поддержки XSD (теперь XSD-конструкции, неопознанные парсером, превращаются в поля XmlElement, которые затем могут быть обработаны через DOM API), WSDL, улучшений в сериализации в режиме выполнения (обеспечена поддержка обобщений и SqlType, реализована возможность создания собственных сериализаторов на основе интерфейса IXmlSerializable) и некоторых оптимизаций на уровне кода. Кроме того, реализована поддержка создания контрактов Web-сервисов на основе интерфейсов. Цель всего этого — унифицировать традиционные подходы к описанию контрактов, используемые при создании распределенных систем (IDL или схожие механизмы), а также XSD/WSDL-механизмы, применяемые при описании контрактов в Web-сервисах. Воможность описания контракта на уровне интерфейса с последующей генерацией необходимого WSDL-кода значительно упрощает работу программистов, так как не требует от них знания нюансов описания контракта на WSDL-коде и позволяет сосредоточиться на реализации кода. К тому же интерфейс может использоваться другими программистами для вызова методов классов, реализованных в Web-сервисе.

При использовании интерфейса для описания Web-сервиса он обрамляется атрибутом [WebServiceBinding], а описания методов — традиционными атрибутами [WebMethod]. В случае необходимости можно использовать и атрибут [SoapDocumentMethod] для задания дополнительных деталей Web-методов. Атрибут [WebService] используется в классе, который содержит реализацию интерфейса. Всей этой информации вполне досаточно для автоматической генерации WSDL-контракта (portType/binding).

Помимо рассмотренных выше изменений и улучшений, следует также отметить реализацию поддержки протокола SOAP 1.2 и WS-I Basic Profile 1.1, поскольку при этом Web-сервисы, создаваемые на основе .NET Framework 2.0, становятся более открытыми к взаимодействию с кодом, написанным на других платформах.

При включении поддержки SOAP 1.1 и SOAP 1.2 на стороне сервера каждый Web-сервис будет поддерживать оба протокола — клиент сам выбирает, какой из них использовать. Например, можно указать значение свойства SoapVersion прокси-класса как System.Web.Services.Protocols.SoapProtocol-Version.Soap12 — тогда будет использоваться протокол SOAP 1.2.

Поддержка базового профиля задается через свойство ConformanceClaims атрибута [WebServiceBinding]. Так, установка значения этого свойства в WsiClaims.BP10 указывает на то, что Web-сервис соответствует WS-I Basic Profile 1.0.

Еще одним новшеством является поддержка сжатия HTTP-ответов на уровне класса HttWebRequest с использованием соответствующих возможностей Internet Information Services 6.0. В .NET Framework 2.0 Beta 1 для включения распаковки на клиентской части приложения следует воспользоваться свойством EnableDecompression класса HttpWebRequest, присвоив ему значение true.

В начало В начало

Заключение

На этом наше знакомство с новшествами .NET Framework 2.0 не заканчивается. В следующем номере мы начнем рассказ о семействе средств разработки Visual Studio 2005, которые предназначены для создания различных типов приложений на основе .NET Framework 2.0. Сначала мы рассмотрим линейку продуктов, входящих в это семейство, а затем планируем посвятить более подробные статьи каждому из продуктов Visual Studio 2005.

КомпьютерПресс 5'2005

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует