« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
    Популярное
Глава 8. Правила программирования на С++

Особенности форматирования данных согласно спецификации SOAP

Динамическое создание компонентов

Взлом компонентов Delphi

Функция date() - вывод даты и времени в PHP

Что нового в Perl 5.10?

Рефакторинг JavaScript с применением Microsoft ASP.NET AJAX. Александр Шер

Функция GetInstanceData

Ошибки начинающих PHP разработчиков

Создание простого COM-объекта




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 164
Пользователей: 0

Статьи:: .NET Framework :: Учебник по ASP.NET :: Глава 6 SOAP



отправить ссылку другу версия для печати  Обсудить на форуме

Глава 6 SOAP



Основы
Структура SOAP
Заголовки сообщений SOAP
Тело SOAP-сообщения
Типы данных SOAP

Основы

В следующей главе мы будем рассматривать одну из самых заманчивых и интересных возможностей технологии Microsoft .NET — Web-сервисы, осуществляющие связь со своими клиентами посредством независимых от платформы способов передачи данных. Подобных способов три, но протокол для них используется один — HTTP. Два способа основаны на методах get и post, присущих HTTP, но самым интересным и прогрессивным, пожалуй, является использование XML для передачи данных от сервиса к клиенту и обратно. При этом используется не "сырой" XML, а основанный на нем SOAP (Simple Object Access Protocol).

SOAP, как следует из его названия, это простой протокол доступа к объектам. Microsoft давно вынашивала идею создать сервисы, к которым клиенты могли бы обращаться по общим правилам запроса. Первая попытка была сделана задолго до внедрения технологии Microsoft .NET. Протокол SOAP применялся для создания сервисов на базе сервера BizTalk. Попытку внедрения этой достаточно сильно связанной пары технологических решений вряд ли можно назвать успешной. Но с появлением феноменатьной платформы Microsoft .NET протокол SOAP обрел второе дыхание. Он действительно удобен.

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

Буквально с самых первых версий операционной системы Windows был взят курс на как можно более плотную интеграцию различных приложений. Каждый шаг на этом пути, будь то DDE (Dynamic Data Exchange) или OLE (Object Linking and Embedding), объявлялся серьезным прорывом в этой области. Впрочем, будем объективны, почти всегда именно так и было. Любое усовершенствование на этом тернистом пути давалось очень нелегко.

Однако первый свет в конце тоннеля (хотя неизвестно еще, существует ли вообще выход у этого тоннеля) забрезжил с внедрением технологии СОМ (Common Object Model). Эта объектная модель позволяла создавать различные функциональные объекты, которые предоставляли при помощи специализированных интерфейсов иным программам средства работы с собой. Другими словами, если некий СОМ-объект мог проверять орфографию в тексте, то любое приложение могло использовать эту его способность, воспользовавшись стандартным интерфейсом объекта СОМ. Таким образом, СОМ-объекты становились чем-то вроде блоков конструктора Лего, из которых умелый разработчик собирал мощное приложение в короткие сроки.

Основным ограничением подобных объектов служила их привязанность к одной платформе — Windows. Конечно, она очень сильно распространена в компьютерной индустрии (причем в данном случае слово "очень" может оказаться преуменьшением), но все равно, область распространения СОМ-объектов ограничена. Причем следует осознавать, что существуют объективные трудности с их использованием в среде Интернет.

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

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

Следовательно, основываясь на подобной архитектуре, можно создать сервисы и клиенты, которые также могли бы передавать и принимать информацию по протоколу HTTP. Так как используется протокол, не зависящий от конкретной платформы, то сервис и клиентская программа тоже не обязаны функционировать в одной и той же операционной системе. Однако есть еще две нерешенных проблемы. Во-первых, сервис должен быть само-документируемым, т. е. поставлять информацию о себе неким стандартным способом. Клиент может получить эту информацию, а затем на ее основе строить свое дальнейшее взаимодействие с сервисом. Во-вторых, необходимо осознавать, что протокол НТГР является лишь транспортным протоколом и не подходит в качестве языка коммуникации. Для отображения Web-страниц использовался язык HTTP, но его возможностей явно будет не хватать для взаимодействия программ. Поэтому на роль языка коммуникации был выбран SOAP.

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

Как мы знаем из предыдущей главы, логическая структура каждого XML-документа определяется его DTD-блоком. Так вот, для SOAP заранее определены все возможные теги и типы данных, поэтому SOAP-документы не нуждаются в DTD-блоках. За счет подобной унификации сервисы и клиенты освобождаются от достаточно тяжелой процедуры синтаксического анализа приходящего документа с неопределенным заранее набором тегов.

Структура SOAP

Любой документ SOAP (хотя в данном случае лучше все-таки называть их не документами, а сообщениями, так как это лучше передает их предназначение) состоит из двух основных частей — заголовка и, собственно, тела документа. Причем все это упаковывается в некий "конверт", и в этом виде передается по протоколу HTTP.

Естественно, все эти уровни иерархии создаются при помощи определенных тегов. Простейший пример того, как выглядит SOAP-запрос, упакованный в протокол HTTP, показан в листинге 6.1.

Листинг 6.1

POST /MyService HTTP/1.1

Host: www.servicesite.com

Content-Type:text/xml; charset="utf-8"

Content-Length: xxxx

SOAPAction: "www.servicesite.com/action"

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/ envelope" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">

<SOAP-ENV:Body>

<m:GetSomeValue xmlns:m=" www.servicesite.com/action ">

<symbol>SYM</symbol>

</m:GetSomeValue>

</SOAP-ENV:Body>

</Soap-ENV:Envelope>

Естественно, первые пять строк относятся не к самому SOAP-запросу, а к протоколу HTTP, по которому он доставляется. Шестая строка объявляет конверт SOAP-запроса. В данном примере показан запрос без заголовка, так как в седьмой строке объявляется тело SOAP-запроса, внутри которого располагаются некоторые данные.

Теперь, когда мы увидели пример стандартного SOAP-запроса, можно поговорить об основных правилах составления и обработки SOAP-сообщений. Прежде всего, приложение, которое получает SOAP-сообщение, должно выделить все его элементы, которые предназначены именно для этого приложения. После выделения подобных компонентов, приложение обрабатывает их согласно логике, заложенной в него. Если SOAP-сообщение не содержит некоторых обязательных частей, оно может (но не обязано) быть отвергнуто приложением. Однако в том случае, если отсутствие этих частей не является критичным для приложения, оно может продолжить обработку SOAP-запроса. В тех случаях, когда SOAP-сообщение предназначено не только для этого конкретного обрабатывающего приложения, то перед отправкой его следующему получателю, приложение должно удалить из сообщения все элементы, относящиеся только к обрабатывающему приложению. Таким образом, переходя по цепочке обрабатывающих приложений, SOAP-сообщение может "худеть".

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

Как было сказано, в SOAP применяются два стандартных пространства имен. Все содержимое SOAP-конверта использует пространство имен, располагающееся по адресу http://shemas.xmlsoap.org/soap/envelope. А применяемые кодировки определены в пространстве имен, находящемся по адресу http://schemas.xmlsoap.org/soap/encoding. В нашем первом примере мы видели ссылки на них.

Так как все возможные элементы сообщений SOAP заранее определены, то нет нужды использовать DTD-блоки. Более того, если в сообщении SOAP будет находиться DTD-блок или даже ссылка на него, оно будет считаться некорректным.

Теперь попробуем определить соотношения между тремя основными блоками SOAP-сообщения. Начнем с более-менее формального описания конверта.

Конверт определяется при помощи элемента Envelope. Это обязательный компонент сообщений SOAP. В нем могут (но не обязаны) быть размещены ссылки на используемые пространства имен. В том случае, если в конверте приложение или разработчик размещают дополнительные элементы, эти элементы должны быть описаны в одном из стандартных пространств имен.

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

Тело SOAP-сообщения объявляется при помощи элемента Body. Этот компонент является обязательным. Так же, как и заголовок, он является прямым потомком конверта. Естественно, как тело, так и заголовок могут существовать в сообщении SOAP только в единственном экземпляре. В том случае, если у сообщения есть заголовок, тело сообщения должно объявляться сразу после заголовка, т. е. открывающий тег тела сообщения должен вплотную примыкать к закрывающему тегу заголовка сообщения.

Во всех компонентах SOAP-сообщения, на любом уровне вложенности тегов может использоваться атрибут encodingstyle, который сообщает, какой набор правил должен применяться для представления данных компонента. Чаще всего при помощи этого атрибута указывают используемую кодировку символов. В качестве значений атрибута используются элементы уже упоминавшегося пространства имен http://schemas.xmlsoap.org/soap/encoding. Если для какого-либо компонента SOAP-сообщения не указан явным образом данный атрибут, то используются атрибуты родительских компонентов. Проще говоря, если разработчик или приложение задали правила отображения в заголовке, то они будут распространены на все приложение, за исключением тех его элементов. в которых явным образом установлено другое значение данного атрибута.

Теперь перейдем к более детальному рассмотрению правил создания заголовка и тела SOAP-сообщений.

Заголовки сообщений SOAP

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

<SOAP-ENV:Header>

<trans .-Transaction xmlns : trans="http: //www.myhost. com/namespaces/ myspace/"

SOAP-ENV:mustUnderstand="l">

12

</trans:Transaction>

</SOAP-ENV:Header>

В этом маленьком примере мы объявили элемент заголовка с наименованием Transaction. При этом пространство имен, в котором описан данный элемент, находится по адресу http://www.myhost.com/naraespaces/rayspace/. Значение элемента Transaction в данном случае равно двенадцати. Также данный элемент обладает атрибутом mustunderstand с единичным значением. Об этом атрибуте следует поговорить несколько подробнее.

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

Подобный атрибут может принимать всего два значения — единичное и нулевое. Атрибут mustunderstand с нулевым значением эквивалентен отсутствию этого атрибута.

Если обрабатывающее приложение не может правильно распознать элемент заголовка с атрибутом mustunderstand, то оно обязано вернуть SOAP-сообщение с указанием кода возникшей ошибки. Точно также ему следует поступить, если значение этого атрибута будет отличаться от нуля или единицы.

Помимо атрибута mustunderstand, у элементов заголовка SOAP-сообщения может быть атрибут actor. Как говорилось несколько ранее, одно и то же сообщение может обрабатываться несколькими приложениями. При этом оно передается между ними по цепочке, т. е. приложение, обработавшее сообщение, передает его следующему получателю. При этом в заголовке сообщения могут находиться элементы, предназначенные для разных приложений. И далеко не факт, что элементы, помеченные как mustunderstand, будут "понятны" каждому приложению в цепочке. Приложения потому и разные, что у каждого своя функциональность, и для каждого есть свой набор элементов, которые они обязаны "понимать". Поэтому необходимо каким-либо образом указывать, для какого именно приложения предназначен тот или иной элемент. Именно для этой цели и существует атрибут actor.

Каждому приложению, обрабатывающему SOAP-сообщение, придается некий уникальный идентификатор. И тогда в качестве значения атрибута actor некоего элемента используется идентификатор именно того приложения, которое должно обрабатывать данный элемент. Так как каждое приложение знает собственный идентификатор, выделение именно тех элементов заголовка, которые ему нужны, становится тривиальной задачей.

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

Следует также отметить, что в качестве значения данного атрибута можно использовать идентификатор http://schemas.xmlsoap.org/soap/actor/next, который указывает, что сообщение должно быть передано первому приложению из списка получателей. Если же атрибут actor вообще не применялся в объявлении элементов заголовка SOAP-сообщения, это означает, что у данного SOAP-сообщения есть только один получатель.

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

Тело SOAP-сообщения

Как мы уже знаем, именно в теле SOAP-сообщения передаются все основные данные, которые необходимо обработать получателю. Эти данные заключены между стартовым и конечным тегами элемента Body, которым, собственно, и объявляется тело SOAP-сообщения. Как и в заголовке, каждый элемент должен быть описан при помощи некоего пространства имен. Полное наименование элемента должно состоять из его имени и идентификатора используемого пространства имен.

Элементы тела SOAP-сообщения соответствуют тем элементам заголовка сообщения, которые обладают атрибутом mustunderstand с единичным значением. Однако с практической точки зрения, элементы тела SOAP-сообщения можно рассматривать как удаленные вызовы некоторых методов обрабатывающего приложения. Другими словами, приложение, отсылающее SOAP-сообщение, при помощи элементов его тела заставляет принимающее приложение выполнять те или иные действия. Если мы еще раз посмотрим на листинг 6.1, то увидим, что тело сообщения объявлялось при помощи следующего фрагмента кода:

<SOAP-ENV:Body>

<m:GetSomeValue xmlns:m=" www.servicesite.com/action">

<symbol>SYM</symbol>

</m:GetSomeValue>

</SOAP-ENV:Body>

Первая и последняя строки содержат открывающий и закрывающий, соответственно, теги тела сообщения. А вот между ними уже располагается некая информация, которая и предназначена для обрабатывающего приложения. Вторая строка, по сути дела, является вызовом некоего метода с внутренним наименованием GetsomeVaiue. При этом в качестве параметра данному методу передается значение sym типа symbol. Естественно, имена типов и методов являются условными. Наименование метода может не совпадать с наименованием функции, этот метод реализующей. А тип значения, естественно, распознается самим обрабатывающим приложением.

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

Данный элемент может содержать четыре встроенных элемента. Рассмотрим их подробно.

  • Элемент fauitcode предназначен для передачи кода возникшей ошибки. Этот элемент обязательно должен входить в состав своего родительского элемента Fault. Его значением должно быть полное наименование ошибки.
  • Элемент fauitstring содержит текстовое описание ошибки. Он также обязан входить в состав родительского элемента Fault. На значение этого элемента не накладывается каких-либо жестких условий, но все же рекомендуется вносить в него дополнительную информацию о возникшей ошибке, так как стандартные коды ошибок могут указать лишь тип возникшей проблемы, но не локализовать ее.
  • Элемент fauitactor указывает на приложение, в котором и возникла ошибка. Если у SOAP-сообщения есть всего лишь один адресат, тогда нет нужды использовать этот элемент, так как и без того понятно, что ошибка могла возникнуть лишь при работе единственного адресата. Но вот если для сообщения заготовлена цепочка обработчиков, и ошибка возникла не по вине последнего в этой цепочке приложения, то приложение, в котором возникла ошибка, обязано включить в состав элемента Fault данный элемент fauitactor, и указать в качестве его значения свой собственный идентификатор.
  • Элемент detail служит для передачи детальной информации о возникшей ошибке. Он обязан включаться в состав элемента Fault, если ошибка возникла в процессе обработки тела сообщения. Если же ошибка появилась при обработке иных компонентов SOAP-сообщения, наличие данного элемента не является обязательным. В состав данного элемента должны входить иные элементы, определяемые приложением, в которых оно будет указывать локализованную причину ошибки, и возможные действия отправителя, которые необходимо произвести в ответ на получение сообщения об ошибке.

Также следует рассмотреть стандартные классы ошибок, которые являются значениями элемента fauitcode. Они определены в пространстве имен http://shemas.xmlsoap.org/soap/envelope.

  • Код versionMismatch указывает, что приложение-обработчик обнаружило ссылку на неверное пространство имен в элементе Envelope.
  • Код Mustunderstand сигнализирует, что в заголовке SOAP-сообщения обнаружен элемент с атрибутом mustunderstand, которому приписано единичное значение, и этот элемент не распознан обрабатывающим приложением, и, соответственно, не был им обработан.
  • Код client свидетельствует о возникновении класса ошибок, которые не могут быть самостоятельно устранены обрабатывающим приложением. Чаще всего возникновение подобных ошибок свидетельствует о том, что в сообщение не была вложена некая важная информация.
  • Код server указывает, что ошибка возникла на стороне обрабатывающего приложения, но при этом она возникла не из-за содержимого SOAP-сообщения. Чаще всего это свидетельствует, что обрабатывающее приложение не смогло выполнить некоторые свои функции, например, из-за того, что не смогло загрузить некоторые свои удаленные компоненты. Обычно при получении сообщения с ошибкой подобного класса, отсылающее приложение может повторно послать SOAP-сообщение в надежде на то, что принимающее приложение все-таки сможет его правильно обработать.

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

Типы данных SOAP

В стандарте XML не предусмотрены стандартные типы данных. Из-за его гибкости нет нужды каким-либо особым образом объявлять единый набор типов данных для всех XML-документов. Каждый разработчик может сам объявить именно те типы данных, которые будут применяться в его наборе XML-документов. Однако подобные типы должны, естественно, объявляться в DTD-блоке. Так как в SOAP-сообщениях нет DTD-блоков, то для них заранее объявлены возможные типы данных.

Структура типов для SOAP-сообщений в достаточно большой мере унаследована из словаря XML Schema. Данный словарь был введен в обращение корпорацией Microsoft. Он позволял пользоваться заранее определенным набором тегов и типов данных, таким образом несколько сужая функциональность XML, но приводя документы к некоему стандартизованному виду.

В SOAP мы можем применять простые и составные типы данных. Для начала следует разобраться с простыми типами, которые полностью унаследованы из XML Schema.

Тип boolean предназначен для реализации логических значений. По сути, является перечислимым типом. В качестве допустимых значений могут использоваться только ключевые слова true и false, первое из которых обозначает истинность утверждения, второе — ложность.

Тип float предназначен для представления численных данных. Для хранения каждой численной величины этого типа отводится тридцать два бита, т. е. четыре байта. При этом значение представляется в виде произведения целого числа, чье абсолютное значение меньше или равно 16 777 216, и экспоненты, показатель степени которой может находиться в пределах от 104 до -149.

Тип double также предназначен для численных данных. Но для каждого значения этого типа отводится уже шестьдесят четыре бита, т. е. восемь байтов. Соответственно изменяется и точность представления чисел, и возможный диапазон представимых значений.

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

Тип timeDuration предназначен для хранения данных о времени. Значение этого типа состоит из шести частей. В нем указываются год, месяц, день, часы, минуты и секунды. Вид значений этого типа описывается в стандарте ISO 8601. Порядок используется именно тот, в котором отдельные части были перечислены. Для указания года применяются четыре символа, на остальные части значения времени отводится по два символа.

Тип recurringDuration задает период времени, в течение которого будет с определенной частотой происходить или производиться некое действие. По сути, этот тип является набором значений типа timeDuration.

Тип binary предоставляет возможность хранить и обрабатывать данные в двоичном виде, т. е. по сути, это реализация любых объектных вставок — графики, звука, видеоклипов и иных бинарных объектов.

Тип uriReference позволяет задавать URI (Universal Resource Identifier) в качестве содержимого какого-либо элемента. Детально структура URI описана в документах RFC 2396 и RFC 2732.

Тип integer предназначен для хранения целочисленных значений. Создан на основе типа decimal. Значения этого типа представляют собой конечную последовательность десятичных цифр с необязательным символом математического знака впереди. В том случае, если перед положительным числом ставится знак плюса, то он игнорируется.

Тип nonPositiveinteger создан на основе типа integer. Этот тип предназначен для хранения неположительных целочисленных данных. Неположительные целочисленные данные объединяют нуль и все целые отрицательные числа.

На основе этого типа создан тип negativeinteger. Используется для представления отрицательных целых чисел. Данные этого типа представляют собой конечную последовательность десятичных цифр со знаком минуса впереди.

Тип long создан на основе типа integer. Этот тип хранит данные не в форме последовательности символов цифр, а как единое численное значение. Естественно, это налагает ограничения на диапазон хранимых данных. Для хранения одного числа отводится восемь байтов. Так как величины данного типа могут быть как отрицательными, так и положительными, границы допустимого диапазона значений установлены от 9 223 372 036 854 775 807 до -9 223 372 036 854 775 808.

На основе типа long построен тип int. Он также предназначен для представления целых чисел, но для хранения каждого числа отведено четыре байта. Таким образом, величины данного типа могут находиться в промежутке от 2 147 483 647 до -2 147 483 648. Лексически значения данного типа представляют собой конечную последовательность десятичных цифр с необязательным символом математического знака в начале.

Если под хранение целого числа отводить не четыре байта, а два — мы получим тип short, декларируемый на основе типа int. Промежуток допустимых значений для этого типа лежит от 32 767 до —32 768.

Тему экономии памяти продолжает тип byte, созданный на базе типа short. Как следует из его названия, под хранение одного целого числа отводится один байт. Следовательно, мы можем использовать только числа от 127 до —128.

Тип nonNegativeinteger основан на типе integer и предназначен для хранения неотрицательных целых чисел. По сути, мы просто жестко задаем нулевое значение свойства mininciusive. Все остальное остается без изменений.

На базе этого типа создан тип unsignedLong. Он предназначен для хранения беззнакового целого числа. Максимальное возможное значение свойства maxinclusive — 18 446 744 073 709 551 615. Минимальное, естественно — 0.

Тип unsignedint является производным от типа unsignedLong. Разница между ними заключается в количестве байтов, отводимых под хранение одного числа. Тип unsignedint — вдвое экономнее. Данные этого типа лежат в промежутке от 0 до 429 4967 295 включительно.

Тип unsignedshort, построенный на базе только что рассмотренного нами типа unsignedint, под одно число отводит всего два байта. Но так как мы используем в данном случае беззнаковые числа, то максимально возможное число этого типа — 65 535.

Последним из типов, предназначенных для хранения целых беззнаковых чисел, является unsignedByte. Легко понять, что для хранения отдельного числа этого типа применяется всего один байт. Таким образом, мы можем использовать рассматриваемый тип для чисел в промежутке от 0 до 255 включительно.

Тип posltiveinteger предназначен для хранения и представления положительных целых ЧИСел. Он Построен на ОСНОВе ТИПа nonNegativelnteger. При хранении данных этого типа опциональный знак плюса и нули, стоящие в начале числа, игнорируются.

Тип timeinstant предназначается для отображения данных, хранящих информацию о времени и дате. Таким образом, если мы используем рассматриваемый тип для хранения точки времени 13 часов 20 минут 31 марта 2000 года в часовом поясе, смещенном на пять часов относительно времени по Гринвичу, отображаться это значение будет как "2000-оз-31Т13:20:00-05:00".

Тип time позволяет хранить данные только о времени, без указания даты. Таким образом, то же самое время 13.20 в искомом часовом поясе будет отображаться как "13:20:00-05:00".

Тип timePeriod используется для обработки и отображения неких промежутков времени, для которых явно задано время начала и окончания. На самом деле данный тип не рекомендуется напрямую использовать в XML-документах, созданных по спецификации XML Schema. Рекомендуется использовать типы данных, построенные на его основе.

Тип date является первым из рассматриваемых нами типов данных, созданных на основе типа timePeriod. Он позволяет указывать промежуток времени величиной в одни сутки, который начинается в полночь указанной даты суток и заканчивается в полночь следующих суток. Иначе говоря, значение "2000-12-06" указывает не на точку времени, а на временной промежуток, который начинается в полночь шестого декабря двухтысячного года и длится до полуночи седьмого декабря двухтысячного года. В спецификации XML Schema сказано, что данный тип предназначен для обработки суточного интервала времени "вне зависимости от количества часов в этом дне". В качестве данных этого типа могут применяться только даты стандартного Григорианского календаря в виде "yyyy-mm-dd". Если необходимо использовать дату до нашей эры, то перед годом ставится знак минуса.

Тип month основан на типе timePeriod. Он предназначен для определения промежутков времени длиною в месяц. Этот промежуток начинается в полночь первого дня указанного месяца и заканчивается в полночь первого дня следующего месяца. Данные этого типа имеют формат "yyyy-mm". Таким образом, чтобы обозначить декабрь двухтысячного года, мы должны записать строку "2000-12".

Тип year используется для хранения годичных промежутков времени. Данные этого типа указываются в виде строк формата "yyyy". Искомый промежуток времени начинается в полночь первого дня указанного года, а заканчивается в полночь первого дня следующего года. Таким образом, весь прошедший двухтысячный год мы можем обозначить строкой "2000". Если необходимо указать годы до нашей эры, то перед номером этого года, в котором, кстати, может быть больше четырех цифр, мы должны поставить знак минуса.

Тип century предназначен для обработки столетий. При этом значения данного типа представляются в виде двух цифр, являющихся обозначением века в нумерации годов. Таким образом, если мы хотим задать двадцатый век, то мы должны использовать значение 19. Данный промежуток времени начинается в полночь первого дня указанного столетия, а заканчивается в полночь первого дня следующего века.

Тип recurringDate предназначается для обработки неких ежегодно повторяющихся дат. Значениями данного типа являются строки формата "mm-dd", т. е., если мы задаем значение " 12-06", то мы указываем ежегодно повторяющуюся дату — шестое декабря. Естественно, при помощи величин этого типа чрезвычайно удобно задавать самые различные годовщины, такие, как дни рождения.

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

Теперь перейдем к рассмотрению сложных типов данных. К ним относятся массивы, перечислимые списки и составные типы данных. Начнем мы с ознакомления с перечислимыми списками.

Перечислимые списки функционально весьма похожи на Enumeration-классы, которые мы использовали в Visual Basic .NET. В этих списках могут храниться значения любых типов, кроме типа Boolean. Естественно, элементы списка должны иметь один и тот же тип. В качестве примера можно привести хранение в подобном списке цветов продаваемых машин. Тогда в SOAP-сообщении будет находиться приблизительно следующий фрагмент кода:

<element name="CarColor" type="tns:CarColor" />

<simpleType name="CarColor" base="xsd:String">

Enumeration value="Red" />

Enumeration value="White" />

Enumeration value="Blue" />

</simpleType>

<Car>

<Model>Ferrary</Model>

<CarColor>Red</CarColor>

</Car>

В этом примере мы объявляем перечислимый тип carCoior, который создается на основе базового типа string. Затем, при помощи тегов <enumeration> задаются конкретные значения, входящие в перечислимый список. Естественно, эти теги заключаются между стартовым и закрывающим тегами <simpieType>. А затем уже при указании данных об объекте саг мы используем одно из предустановленных значений заранее объявленного перечислимого списка.

Теперь перейдем к составным типам. Теоретически, массивы в SOAP тоже относятся к составным типам. Но разработчикам все-таки привычнее под составными типами понимать именно определяемые структуры. Если говорить строго, то структура является составным значением, элементы которого идентифицируются только их наименованиями, причем, эти наименования должны быть уникальны для каждого элемента структуры. По сути, структуры напоминают классы, но их нельзя назвать полноценными классами, так как они не могут включать в себя методы и свойства. Когда мы в предыдущем примере указывали информацию о конкретной машине, то неявно подразумевалось, что объект Саг как раз и попадает под определение составного типа. В том случае, когда приложение, принимающее SOAP-сообщение, заранее "знает" его структуру, нет смысла описывать все составные типы данных. Однако так может быть далеко не всегда, поэтому если в цепочке получателей SOAP-сообщения есть приложение, которое не извещено о структуре сообщения, следует объявлять используемые составные типы.

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

<element name="Book"> <complexType>

<element name="author" type="xsd:string">

<element name="name" type="xsd:string">

<element name="price" type="xsd:float">

</complexType>

<element/>

<Book>

<аи1:Ьог>Гибсон y.</author>

<пате>Нейромантик</name>

<price>58.75</price>

</Book>

Легко заметить, что объявление структуры составного типа производится между тегами <compiexType> и </compiexType>. Мы задаем два элемента строчного типа, в которых хранятся наименование книги и имя ее автора, и один элемент числового типа, в котором будет храниться цена продаваемой книги. После объявления составного типа располагается сам экземпляр значения этого типа. В SOAP-сообщении передается информация о книге Уильяма Гибсона "Нейромантик", которая продается по цене 58,75$.

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

Любой массив в SOAP должен объявляться при помощи типа SOAP-ENC: Array. Вот простейший пример объявления массива из трех элементов целочисленного типа:

<element name="MyArray" type="SOAP-ENC:Array" />

<MyArray SOAP-ENC:arrayType="xsd:int[3]">

<item>1</item>

<item>2</item>

<item>3</item>

</MyArray>

Естественно, SOAP позволяет определять и многомерные массивы данных. Объявление массива размером "два на три", состоящего из элементов строкового типа, может выглядеть следующим образом:

<MyStringArray SOAP-ENC:arrayType="xsd:String[2,3]">

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

FONT>







HTML 5: пять вещей вызывающих особый интер....

Html

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


Подробнее... | Рубрика: Html | Добавлено: 22.12.2008

asp.net: ListView с разных сторон.

.NET компоненты

Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.


Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

Создание кросс-таб отчета в Stimulsoft Rep....

.NET компоненты

Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.


Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

Остальные статьи:

VivaMP - инструмент для OpenMP
Создаем контекстно-зависимое WPF-приложени...
Windows Vista SP2: что внутри и что важно?
Вышел MySQL 5.1.30, первый стабильный рели...
Тестирование параллельных программ
Архитектура AMD64 (EM64T)
Платформа 2009. Определяя будущее
Windows Vista Bridge Sample Library - упра...
Оптимизация 64-битных программ
Подгрузка через AJAX HTML-кода, содержащег...
Обзор нового релиза самой мощной Ajax библ...
Firebug 1.3 и 1.4 alpha — что нового и инт...
Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия