Автор: Dflying Chen ( http://dflying.cnblog.som/ )
Для программы Atlas в некоторых случаях нам необходимо вызвать большое количество веб-служб за короткое время, например, пользователи в списке быстро нажимают, чтобы удалить . В настоящее время пропускная способность сети, стабильность и т. д. часто вызывают более длительные задержки. Если эти вызовы можно объединить в один запрос, пользователям нужно будет выдержать всего одну сетевую задержку, чтобы получить результаты обработки, что также косвенно повышает эффективность. Кажется, реализовать эту функцию непросто, но, к счастью, в Atlas есть встроенная поддержка пакетного вызова веб-сервисов. Все, что вам нужно, — это простая настройка в программе.
Каждый запрос на вызов веб-службы в Atlas имеет три приоритета: 0: высокий, 1: средний, 2: низкий, а значение по умолчанию — средний.
При вызове вы можете указать приоритет этого вызова через параметр Priority (см.: Вызов веб-службы в ASP.NET Atlas — обработка ошибок, тайм-аутов и реагирование на операции отмены пользователя). Для вызовов с высоким приоритетом Atlas не применяет пакетные вызовы и каждый раз отправляет запрос немедленно; для вызовов со средним и низким приоритетом Atlas завершает вызовы в течение определенного периода времени (см. описание WebRequestManager ниже). ) в один Отдельные запросы отправляются вместе или когда количество вызываемых запросов достигает заданного значения (см. введение в WebRequestManager ниже). Если запросов для вызова слишком много, в первую очередь будут выбраны запросы со средним приоритетом.
Чтобы включить встроенную поддержку веб-службы пакетных вызовов Atlas, сначала необходимо зарегистрировать серверный обработчик для пакетной обработки вызовов в файле web.config (шаблон веб-сайта Atlas по умолчанию включил этот обработчик):
<httpHandlers>
<add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/>
</httpHandlers>
Затем добавьте оператор отображения WebRequestManager в XML-скрипт Atlas страницы и настройте страницу на разрешение пакетных вызовов веб-службы: <script type="text/xml-script">
<page xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<компоненты>
<webRequestManageratchSize="5" EnableBatching="true" patchDelay="3000" />
</компоненты>
</страница>
</скрипт>
Здесь вам следует обратить внимание на следующие три свойства WebRequestManager:
EnableBatching: определяет, разрешает ли страница пакетные вызовы. Значение по умолчанию — false. Здесь мы должны установить значение true.
BatchSize: установите максимальное количество запросов, включенных в пакетный вызов. Значение по умолчанию — 5. Когда количество вызываемых запросов превышает этот параметр, пакетный запрос будет отправлен немедленно, даже если предел времени, установленный в параметре patchDelay, не достигнут.
BatchDelay: установите ограничение времени ожидания для пакетного вызова. Значение по умолчанию — 1000 (миллисекунды). Когда ограничение времени ожидания превышает этот параметр, пакетный запрос будет отправлен немедленно, даже если количество запросов в BatchSize не достигнуто.
После этого параметра пакетные вызовы будут применяться к каждому запросу веб-службы на странице. Поэтому для одиночного вызова следует указать высокий приоритет.
Давайте рассмотрим пример. Сначала напишем веб-службу, которая имеет следующий веб-метод. Два параметра представляют порядок задачи (чтобы мы могли различать порядок выполнения задачи) и приоритет:
[WebMethod].
публичная строка DoTask (int TaskID, int Priority)
{
если (приоритет < 0 || приоритет > 2)
throw new Exception("приоритет может быть только 0, 1 или 2!");
return string.Format("Задача (ID: {0}, приоритет: {1}) завершена.", TaskID, Priority);
}
Затем следуйте коду в начале, чтобы включить пакетные вызовы в web.config, и добавьте WebRequestManager на страницу. Не забывайте, что на странице также необходим ScriptManager для ссылки на веб-службу, определенную выше: <atlas:ScriptManager ID=. "scriptManager" runat="сервер">
<Услуги>
<atlas:ServiceReference Path="SampleService.asmx" />
</Услуги>
</atlas:ScriptManager>
Добавьте HTML-разметку. Кнопка используется для запуска пакетных вызовов, а элемент div используется для отображения результатов вызова
:
<div id="результат"/>
Наконец, есть сценарий JavaScript для вызова веб-службы:
функция ignoreTasks_onclick().
{
// очищаем вывод
$('result').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
}
Вар TaskID = 0;
функция DoTask(время, приоритет)
{
for (var i = 0; i < раз; ++i)
{
SampleService.DoTask(
идентификатор задачи++,
приоритет,
{onMethodComplete: OnComplete, приоритет: приоритет}
);
}
}
функцияOnComplete(результат)
{
$('result').innerHTML += результат + "<br />";
}
Обратите внимание, что метод DoTask() принимает два параметра: times используется для указания количества вызовов, Priority используется для указания приоритета, и мы используем глобальную переменную TaskID для поддержания возрастающей последовательности запросов.
В этом примере мы сначала вызвали запрос с низким приоритетом, затем запрос со средним приоритетом и, наконец, два запроса с высоким приоритетом.
Поскольку высокий приоритет не участвует в пакетных вызовах, первое, что вы видите — это их возврат:
Поскольку общее количество средних и низких приоритетов равно 2 и еще не достигло 5 , оно отправляется с задержкой в 3000 миллисекунд:
Вы можете изменить последовательность вызовов и количество вызовов в методе ignoreTasks_onclick(), чтобы проанализировать, как реализованы пакетные вызовы.
Пример программы можно скачать здесь: