Веб-службы и броузеры Mozilla

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

В броузере Mozilla имеется класс SOAPCall, который обслуживает весь комплекс взаимодействий с удаленной службой. Так как он использует протокол SOAP 1.1, вам потребуется настроить заголовок SOAPAction (который для удобства оформлен в виде свойства класса SOAPCall) и определить URL файла веб-службы. Ниже приводится фрагмент, который выполняет эти действия:

var soapcall = new SOAPCall( );
soapcall.actionURI = "http://hauser?wenz.de/AspNetAJAX/DivideNumbers";
soapcall.transportURI =
"http://localhost:1234/AJAXEnabledWebSite1/MathServiceDocEnc.asmx";

Все параметры, которые передаются веб-службе, имеют тип SOAPParameter.


В конструктор класса первым аргументом передается значение, а вторым – его имя.

var p1 = new SOAPParameter(6, "a");
var p2 = new SOAPParameter(7, "b");

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

Вся хитрость состоит в том, чтобы вручную указать правильную кодировку для целочисленных значений. Для этого нужно загрузить пространство имен, соответствующее типу данных SOAP – integer. Затем параметрам, отправляемым веб?службе, записать в свойство schemaType получившийся тип данных. Ниже приводится фрагмент, который выполняет все эти действия:

var senc = new SOAPEncoding( );
assenc = senc.getAssociatedEncoding(
"http://schemas.xmlsoap.org/soap/encoding/",
false);
var scoll = assenc.schemaCollection;
var stype = scoll.getType(
"integer",
"http://www.w3.org/2001/XMLSchema");
p1.schemaType = stype;
p2.schemaType = stype;

Затем необходимо собрать запрос к веб-службе.


Делается это с помощью метода encode(), но только после подготовки всех входных параметров, как показано в следующем фрагменте:

soapcall.encode(
0, // значение по умолчанию для SOAP 1.1
"DivideNumbers", // имя веб?метода
"http://hauser?wenz.de/AspNetAJAX/", // Пространство имен
0, // количество дополнительных заголовков
new Array(), // дополнительные заголовки
2, // количество параметров
new Array(p1, p2) // параметры
);

Наконец, нужно выполнить асинхронный вызов веб-службы с помощью метода asyncInvoke(). В качестве параметра этому методу передается ссылка на функцию обратного вызова.
soapcall.asyncInvoke(callComplete);

Функция обратного вызова принимает три параметра:
• Результат работы веб-службы в формате XML
• Объект SOAPCall (на тот случай, если вас заинтересует содержимое
SOAP?заголовков)
• Код HTTP-статуса вызова

Единственное, что осталось сделать, – это извлечь информацию из полученного XML-документа.


Для начала рассмотрим пример XML-документа, полученного в результате вызова веб-службы MathService – получить эти данные можно с помощью дополнительного программного обеспечения, такого как инструмент Fiddler (http://www.fiddlertool.com/fiddler) или расширение для Mozilla – Live HTTP Headers (http://livehttpheaders.mozdev.org/):


xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://
schemas.xmlsoap.org/soap/envelope/">
0.857142866




Исходя из имеющегося XML?представления данных можно заметить, что для доступа к фактическому результату, 0.857142866, необходимо выполнить следующие действия:
• С помощью свойства body получить доступ к элементу
• С помощью свойства firstChild получить доступ к элементу NumbersResponse>
• Получить доступ к элементу , воспользовав?
шись свойством firstChild еще раз
• Использовав свойство firstChild в третий раз, получить доступ
к следующему текстовому узлу элемента
• С помощью свойства data получить доступ к тексту внутри тексто?
вого узла

Ниже приводится фрагмент JavaScript, который извлекает результат из ответа, полученного от веб-службы:
function callComplete(result, soapcall, status) {
document.getElementById("c").innerHTML =
result.body.firstChild.firstChild.firstChild.data;
}

Объединив все приведенные фрагменты, вы получите сценарий, который приводится в примере 5.8.


Обратите внимание, что для его работы у вас должно быть установлено соединение с Интернетом, чтобы броузер Mozilla мог получить доступ к информации о схемах SOAP.

Пример 5.8. Вызов веб?службы из броузера Mozilla MathServiceMozilla.htm
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd">
ASP.NET AJAX


(body)



:

=


(br /)
onclick="callService(this.form);" />


(/body)
.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Веб-службы и Internet Explorer
Веб-службы и броузеры обоих типов
Доступ к веб-службам из JavaScript
Методы страницы
Обмен данными со сложной структурой

Вернуться в раздел: ASP.NET AJAX / Веб-службы