Главная » Silverlight » Службы, получающие данные XML

0

Простые веб-службы часто позволяют передать все входные параметры в аргумен­тах строки запроса. Однако аргументы строки запроса ограничены правилами URL. Кроме того, в строке тяжело разместить структурированные данные.

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

Дополнительные параметры добавляются путем вставки элементов <member>. Например, можно добавить количество изображений на странице, как в предыдущем примере.

При вызове службы XML-RPC (или любой другой веб-службы, которой необходим за­прос в формате XML) ей нужно передать документ XML в теле запроса HTTP POST. Для этого необходим класс WebRequest, более мощный, чем класс WebClient.

Для создания сообщения XML используется конкатенация строк. Метод HttpUtility. HtmlEncode () применяется для замены символов, запрещенных спецификацией XML, например угловых скобок, их представлениями. Однако строка, созданная путем конка­тенации, довольно хрупкая. В случае ошибки в коде XML о ней не будет сообщено, вме­сто этого появится сообщение о неуспешном вызове службы. Поэтому предпочтителен другой способ создания запроса XML, основанный на использовании классов XDocument (XElement, XAttribute, XComment, XDeclaration и т.д.). Код, полученный с их помощью, чистый и короткий.

Все классы XDocument предоставляют конструкторы, позволяющие инициализиро­вать создаваемые объекты. Например, приведенный ниже оператор создает элемент и добавляет в него текстовое содержимое, размещаемое в коде XML.

XElement element = new XElement("Price", "23.99");

Примечание. Параметрический массив — это параметр, перед которым размещено ключевое слово params. Этот параметр всегда расположен последним и всегда является массивом. Объявлять массив не обязательно. Вместо этого можно привести список объектов. Все они будут автоматически сгруппированы в массив. Один из примеров использования параметрического массива — метод string. Format (). При его вызове можно задать произвольное количество значений.

Экономия кода еще более существенна при вложении всего дерева узлов в один опе­ратор С#. Вложение возможно благодаря тому, что конструкторы классов XDocument и XElement в качестве последнего аргумента могут принимать параметрический мас­сив. Массив содержит список вложенных узлов.

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

XElement element = new XElement("photo", new XAttribute("src",

"http://www.someplace.com/someimage.jpg") new XElement("tag", "horse"), new XElement("tag", "plow")

) ;

Ниже приведена разметка XML, сгенерированная этим кодом.

<photo src=" http://www.someplace.com/someimage.jpg"> <tag>horse</tag> <tag>plow</tag>

</photo>

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

)

)

)

)

)

) ;

Создание содержимого XML с помощью объекта XDocument существенно облегчается тем, что отступы кода С# отображают вложенность элементов XML. Это позволяет визу­ально оценить структуру генерируемого кода XML.

После создания содержимого XML его можно сохранить в объекте TextWriter с помощью метода XDocument. Save () или преобразовать в строку с помощью метода ToString (). При использовании объекта XDocument с классом WebRequest содержимое нужно записать в поток запроса с помощью объекта StreamWriter.

StreamWriter writer = new StreamWriter(requestStream);

writer.Write(document.ToString());

После вызова службы Flickr посредством протокола XML-RPC клиентское устрой­ство получает ответ XML-RPC. Для извлечения объектов photo нужно вызвать метод HttpUtility. Html Decode () и обработать код XML оператором LINQ, который отфиль­трует элементы <photo>.

Примечание. Сейчас вы уже умеете читать и создавать код XML с помощью объекта XDocument. Используемые для этого технологии полезны не только при работе с веб-службами на основе XML, но и в любых ситуациях, в которых нужно обрабатывать код XML (например, при работе с файлом XML, находящимся в изолированном хранилище). Кроме методов, рассмотренных выше, классы XDocument и XElement содержат много других методов, облегчающих редактирование документов XML после их создания. С помощью методов Add (), AddAf terSelf (), AddBeforeSelf () , RemoveNodes (), Remove () , ReplaceWith () можно устанавливать значения элементов и атрибутов, удалять и вставлять узлы, манипулировать деревом узлов и т.д.

Службы, возвращающие данные SOAP

Платформа Silverlight бесшовно взаимодействует со службами .NET (см. главу 15). Эти службы передают закодированные данные SOAP. Протокол SOAP подчиняется стан­дарту XML, поэтому средства Silverlight (например, класс XDocument) можно использо­вать для создания запросов и чтения ответов SOAP. Однако значительно легче приме­нить для этого средства создания ссылок, встроенные в рабочую среду Visual Studio.

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

При добавлении ссылки на службу SOAP программа Visual Studio генерирует класс прокси, асинхронные методы обработки событий и другие средства для каждого метода веб-службы (см. главу 15).

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии