Обработка ошибок

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

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

Однако в случае ASP.NET AJAX и Ajax порядок взаимодействия с веб-службами несколько иной. Непосредственное обращение к удаленной службе невозможно из?за ограничений, накладываемых моделью безопасности. По умолчанию JavaScript и объект XMLHttpRequest имеют доступ только к URI, находящимся в том же домене, что и текущая страница. Таким образом, при использовании ASP.NET AJAX вы будете обращаться к веб?службам, которые находятся в том же домене, то есть к веб?службам, построенным на базе технологий .NET (или WCF, это платформа следующего поколения организации взаимодействий в среде Windows – Windows Communication Foundation).


Как следствие, вам необходимо знать, какая модель исключений используется.

Платформа ASP.NET AJAX позволяет получать доступ из сценариев JavaScript к исключениям, возникшим при работе веб?службы. Для демонстрации этой возможности мы создадим простую веб?службу, выполняющую операцию деления двух чисел. Вы уже наверняка догадались, к чему я клоню: если пользователь попытается выполнить деление на ноль, служба возбудит исключение DivideByZeroException.

Программный код веб?службы (MathService.asmx), которая возбуждает исключение, приводится в примере 5.1. Один важный момент, который следует запомнить: веб?службы, построенные на основе ASP.NET AJAX, обязательно должны иметь атрибуты [ScriptService]
и [WebMethod].

Пример 5.1. Веб?служба, которая возбуждает исключение MathService.asmx
<%@ WebService Language="C#" Class="MathService" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://hauser?wenz.de/AspNetAJAX/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class MathService : System.Web.Services.WebService {
[WebMethod]
public float DivideNumbers(int a, int b) {
if (b == 0) {
throw new DivideByZeroException();
} else {
return (float)a / b;
}
}
}

Теперь создадим страницу, которая будет обращаться к веб-службе.


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



/

=


(br /)
type="button" value="Divide Numbers" onclick="callService(this.form);" />
(br /)


Что касается серверных элементов управления на странице, нам потребуются два таких элемента: ScriptManager и встроенная в него ссылка на используемую веб-службу.

(asp:ScriptManager ID="ScriptManager1" runat="server")

(asp:ServiceReference Path="MathService.asmx" /)

(/asp:ScriptManager)

Теперь можно обращаться к веб-службе через объект-посредник MathService, который будет создан автоматически.


При вызове веб-метода не забывайте передавать ему параметры: первыми должны указываться параметры веб-метода, а затем функция обратного вызова, которая будет вызываться по завершении работы веб-службы. На этот раз методу DivideNumbers() мы будем передавать более одного параметра. Вслед за функцией, выполняющей обработку результатов вызова веб-службы в случае нормального завершения, мы укажем еще одну функцию обратного вызова. Эта новая функция будет вызываться при появлении ошибок, включая ошибку превышения времени ожидания.

function callService(f) {
document.getElementById("c").innerHTML = "";
MathService.DivideNumbers(
parseInt(f.elements["a"].value),
parseInt(f.elements["b"].value),
callComplete,
callError
);
}

Эта функция обработки ошибок будет получать объект с информацией об ошибке, обладающий пятью методами:
get_exceptionType()
Возвращает тип исключения
get_message()
Возвращает сообщение об ошибке, сопровождающей исключение
get_stackTrace()
Возвращает трассировочную информацию об ошибке
get_statusCode()
Возвращает код состояния, отправленный сервером
get_timeOut()
Возвращает признак превышения предельного времени ожидания

Данная информация выводится в элемент
, который был создан специально для этих целей:
function callError(result) {
document.getElementById("output").innerHTML =
"(b)" +
result.get_exceptionType() +
"(/b): " +
result.get_message() +
"(br /)" +
result.get_stackTrace();
}

Остальная часть примера не содержит ничего сложного. В случае нормального завершения веб?службы результат деления будет выводиться в элемент . Полный текст примера находится в примере 5.2.

Пример 5.2. Страница, которая выводит информацию об исключении, возбужденном веб-службой MathService.asmx
Error.aspx
<%@ Page Language="C#" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd"> ASP.NET AJAX


(body)
(asp:ScriptManager ID="ScriptManager1" runat="server")

(asp:ServiceReference Path="MathService.asmx" /)

(/asp:ScriptManager)



/

=


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



(/body)


Теперь, выполнив деление числа 6 на 7, вы получите, как и следовало ожидать, число 0.8571429. Однако если попытаться разделить число 6 на 0, веб-служба выставляет вполне предсказуемое исключение.

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

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

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