Login.htm

Обращаться к Web-сервису из браузера мы будем с помощью «поведения Web-сервиса» (Webservice behavior). «Поведение Web-сервиса» – это отдельная очень обширная и сложная тема, которая никак не входит в рамки данной статьи. Если вы не знакомы с этой технологией или имеете смутное представление о методах ее реализации, отправляю вас к MSDN.

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

Код «поведения Web-сервиса» находится в файле webservice.htc, который можно скачать по адресу http://msdn.microsoft.com/downloads/samples/internet/behaviors/library/webservice/default.asp. Связать «поведение Web-сервиса» с каким-либо элементом странички можно статически или динамически.

Статическое связывание «поведения Web-сервиса»:

<body> <div id="service" style="behavior:url(webservice.htc)"></div></body>

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

Связывание «поведения Web-сервиса» с Web-сервисом в обработчике onload:

<script language="JavaScript"> function init() { service.useService("URL","Friendly name"); }</script><body onload="init()"> <div id="service" style="behavior:url(webservice.htc)"></div></body>

С одним «поведением Web-сервиса» можно связать несколько Web-сервисов, главное чтобы их имена, передаваемые во втором параметре, несовпадали.

После этого можно вызывать Web-методы с помощью функции callService. Но прежде чем рассмотреть, как это делается, хочется остановиться вот на чем. Как вы понимаете, вызов любого Web-метода может занять продолжительное время и будет очень плохо, если приложение пользователя, в данном случае – браузер, на это время будет заблокировано. По умолчанию «поведение Web-сервиса» вызывает Web-методы асинхронно. Это значит, что результаты вызова не доступны вызывающей стороне сразу же после того, как метод callService вернул управление. «Поведение Web-сервиса» определяет набор событий, среди которых есть событие onResult, вызывающееся после получения результатов от Web-метода. Так как с одним «поведением Web-сервиса» может быть связано несколько Web-сервисов, а пользователь может одновременно вызывать несколько методов, для идентификации результатов вызова Web-метода вводится специальный счетчик. Он возвращается функцией callService и, как правило, сохраняется в глобальной переменной. В качестве счетчика в примере, приведенном ниже, используется глобальная переменная callid.

Вызов Web-метода

<SCRIPT language="JavaScript">var callid = 0;function init(){ service.useService("URL","MyService"); callid = service.MyService.callService("method");}function onWSresult(){ // Если в процессе вызова возникла ошибка, и это "наш" метод if((event.result.error) && (callid == event.result.id)) { //event.result.errorDetail.code; //event.result.errorDetail.string; //event.result.errorDetail.raw; } // Если ошибки нет, и это "наш" метод else if((!event.result.error) && (callid == event.result.id)) { alert(event.result.value); } // Произошло что-то странное else { alert("Something else fired the event!"); }}</SCRIPT><body onload="init()"> <div id="service" style="behavior:url(webservice.htc)" onresult="onWSresult()"></div></body>

В данном примере, функция callService принимает один параметр – имя Web-метода, однако, вы также можете указывать неопределенное количество параметров, если это требуется. Например, для Web-метода add необходимо два параметра:

callid = service.MyService.callService("add", 1, 10);

Как видите, в использовании «поведения Web-сервиса» нет ничего сложного.

«Поведение Web-сервиса» обладает большим количеством свойств, и рассмотреть их всех затруднительно, с их помощью вы можете указывать:

  • Имя пользователя и пароль для Web-сервиса, который требует аутентификации
  • Порт Web-сервиса
  • Можете задавать SOAP-заголовки
  • Устанавливать таймаут и многое другое.

Но вернемся к нашим, как говорится, баранам. Имеется страничка Login.htm, которая содержит поля ввода для имени пользователя и пароля. Необходимо проверить, действительно ли данный пользователь зарегистрирован на сайте. Это делается с помощью Web-метода IsUserRegistered.

Проверка учетной записи пользователя:

function onSubmit() { if (!validateForm()) {... } else { service.Simplewebserv.callService("IsUserRegistered", NickName.value, psw.value); }}

Функция onSubmit вызывается при нажатии на кнопку «Вход». Она проверяет корректность введенных пользователем значений и вызывает Web-метод IsUserRegistered с параметрами: имя пользователя и пароль.

Результат анализируется в обработчике события onResult:

function onWSresult() { if (!event.result.error){ var doc = new ActiveXObject("MSXML2.DOMDocument.3.0"); doc.loadXML(event.result.raw.xml); if (doc.parseError.errorCode == 0){ var UserIdNode = doc.selectSingleNode("//sqlresultstream:SqlResultCode"); if (UserIdNode.text == 0){ gen_error.innerText = "Неверное имя пользователя или пароль."; InvalidPsw(); InvalidNickName(); } else{ window.returnValue = "NickName:" + NickName.value + ";UserId:" + UserIdNode.text + ";"; window.close(); } } else{ gen_error.innerText = "Возникла ошибка: " + doc.parseError.reason; } } else{ gen_error.innerText = "Возникла ошибка: " + event.result.errorDetail.string; }}

Так как SQLXML не использует кодирование RPC, нельзя воспользоваться свойством value объекта result. Вместо этого придется «вручную» проанализировать ответ Web-метода в формате xml. Удобнее всего это сделать с помощью объектной модели документа XmlDOM. Интересующее нас значение, т.е. результат вызова находится в элементе SqlResultCode (см. «XML objects»).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: