Автор: Dflying Chen ( http://dflying.cnblogs.com/ )
В предыдущей статье этой серии (Вызов веб-службы в ASP.NET Atlas — введение и простое приложение) мы были знакомы с самым базовым методом вызова веб-службы в Atlas, но в реальной разработке мы просто делаем запрос и ждем. Недостаточно возвращать результаты. Большинству из нас необходимо учитывать время ожидания ошибок и т. д., а также разрешить пользователям отменять операции. К счастью, инкапсуляция веб-метода в веб-сервисе Atlas также полностью учитывает эти потребности.
Для иллюстрации приведем пример веб-метода. Например, для следующего веб-метода:
public class ComplexWebService: System.Web.Services.WebService {
[WebMethod]
общедоступная строка BadMethod (intlayTime, bool throwException)
{
// что-то что-то
}
}
Смесь JavaScript, созданная Atlas, будет иметь следующую подпись: ComplexWebService.BadMethod(
задержкаВремя,
бросокException,
onМетодКомплете,
onMethodTimeout,
onМетодОшибка,
onMethodAborted,
пользовательскийконтекст,
интервал ожидания,
приоритет,
использоватьGetMethod,
);
Обратите внимание, что два параметра веб-метода используются в качестве первых двух параметров метода JavaScript по порядку, а также есть несколько дополнительных параметров:
onMethodComplete: указывает имя функции обратного вызова, которая запускается, когда метод завершается и возвращается успешно. В общем, вам всегда следует указывать этот метод.
onMethodTimeout: указывает имя функции, которая запускается по истечении времени выполнения метода.
onMethodError: указывает имя функции, которая запускается, когда метод обнаруживает исключение во время выполнения.
onMethodAborted: укажите имя функции, которая запускается, когда метод отменяется пользователем во время выполнения.
userContext: объект пользовательского контекста, доступ к которому можно получить с помощью четырех вышеупомянутых функций.
timeoutInterval: установите ограничение времени ожидания в миллисекундах. Значение по умолчанию составляет 90000. Обычно никаких изменений не требуется.
приоритет: установите приоритет выполнения этого метода. Этот приоритет будет использоваться в пакетных операциях AJAX (упомянутых в следующей статье).
useGetMethod: использовать ли HTTP GET для отправки запросов, значение по умолчанию — false.
Порядок восьми вышеуказанных атрибутов должен быть указанным. Но иногда нам нужно указать параметр только позже в заказе, и нам приходится писать предыдущие параметры одновременно. По этой причине Atlas специально предоставляет нам еще один вызывающий метод, передавая методу указанные выше восемь параметров в виде словаря. Например, когда нам нужны только параметры onMethodComplete и timeoutInterval, мы можем написать так:
ComplexWebService.BadMethod(
задержкаВремя,
бросокException,
{
onMethodComplete: CompleteHandler,
таймаутИнтервал: 10000
}
);
Хорошо, давайте на примере рассмотрим общую обработку в четырех вышеупомянутых функциях обратного вызова (onMethodComplete, onMethodTimeout, onMethodError и onMethodAborted) в обычных обстоятельствах.
Сначала давайте завершим метод веб-службы в начале:
using System;
использование System.Web;
использование System.Web.Services;
используя System.Web.Services.Protocols
[WebService(Namespace = " http://tempuri.org/ ")];
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
общедоступный класс ComplexWebService: System.Web.Services.WebService {
[WebMethod]
общедоступная строка BadMethod (intlayTime, bool throwException)
{
если (выбросить исключение)
{
throw new Exception("Извините, мне не нравится это делать!");
}
System.Threading.Thread.Sleep(delayTime);
вернуть «Готово!»;
}
}
Вы можете видеть, что у этого метода есть два параметра:layTime определяет задержку метода, а throwException указывает, генерирует ли метод исключение. Управляя этими двумя параметрами и параметром timeoutInterval при вызове, мы можем моделировать ситуации завершения, тайм-аута и исключения.
Затем добавьте ScriptManager на страницу и добавьте ссылку на эту веб-службу:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<Услуги>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</Услуги>
</atlas:ScriptManager>
Добавьте на страницу ASPX четыре кнопки, которые будут вызывать следующие четыре ситуации: <div>
Это ПЛОХОЙ метод, он может:<br />
<input id="btnWorkFine" type="button" value="работает нормально" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="timeout" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="выдать исключение" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="отменить" onclick="return btnCanceld_onclick()" />
</div>
Завершилось нормально, мы не указали задержку или исключение на стороне сервера и предоставили разумный (10 секунд) тайм-аут:
function btnWorkFine_onclick() {
КомплексВебСервис.БадМетод(
0,
ЛОЖЬ,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnWorkFine_onclick",
10000
);
}
функция onBadMethodComplete (результат)
{
оповещение (результат);
}
Таймаут, укажите задержку на стороне сервера в 3 секунды, но таймаут установлен всего на 1 секунду:
function btnTimeOut_onclick() {
КомплексВебСервис.БадМетод(
3000,
ЛОЖЬ,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnTimeOut_onclick",
1000
);
}
функция onBadMethodTimeout (запрос, userContext)
{
var timeoutString = "Вызов '" + userContext + "' завершился неудачно из-за тайм-аута!";
оповещение (timeoutString);
}
Исключение — укажите исключение, создаваемое сервером. Обратите внимание, что вы можете использовать параметр ответа в функции обратного вызова, чтобы получить подробную информацию об ошибке:
function btnThrowException_onclick() {
КомплексВебСервис.БадМетод(
0,
истинный,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnThrowException_onclick",
10000
);
}
функция onBadMethodError(результат, ответ, userContext)
{
var errorString = "Тест '" + userContext + "' не пройден!";
если (результат == ноль) {
errorString += "Код состояния='" + response.get_statusCode() + "'";
}
еще {
строка ошибки +=
" Сообщение='" + result.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
}
предупреждение (строка ошибки);
}
Пользовательская отмена аналогична обычному завершению, но с использованием request.abort() для отмены операции сразу после выполнения запроса:
function btnCanceld_onclick() {
запрос вар = ComplexWebService.BadMethod(
2000,
ЛОЖЬ,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAborted,
"btnCanceld_onclick",
10000
);
запрос.прервать();
}
функция onBadMethodAborted (запрос, userContext) {
var errorString = "Вызов '" + userContext + "' не удался, запрос прерван!";
предупреждение (строка ошибки);
}
Пример программы можно скачать здесь: