Autor: Dflying Chen ( http://dflying.cnblog.som/ )
Para o programa Atlas, em alguns casos, precisamos chamar um grande número de serviços da Web em um curto espaço de tempo, como usuários em uma lista clicando rapidamente para excluir . Neste momento, a largura de banda da rede, a estabilidade, etc., muitas vezes causam atrasos mais longos. Se essas chamadas puderem ser agrupadas em uma única solicitação, os usuários só precisarão suportar um atraso na rede para obter os resultados do processamento, o que também melhora indiretamente a eficiência. Parece que esta não é uma função fácil de implementar, mas felizmente, o Atlas possui suporte integrado para chamadas em lote de serviços da Web. Tudo que você precisa é de uma configuração simples no programa.
Cada solicitação de chamada de serviço Web no Atlas tem três prioridades: 0: alta, 1: média, 2: baixa e o valor padrão é médio.
Ao chamar, você pode especificar a prioridade desta chamada através do parâmetro prioridade (consulte: Chamando Web Service no ASP.NET Atlas - Tratamento de erros, tempos limite e resposta a operações de cancelamento do usuário). Para chamadas de alta prioridade, o Atlas não aplica chamadas em lote e sempre enviará a solicitação imediatamente; para chamadas de média e baixa prioridade, o Atlas encerrará as chamadas dentro de um determinado período de tempo (consulte a introdução do WebRequestManager abaixo). ) em um Solicitações individuais são enviadas juntas ou quando o número de solicitações a serem chamadas atinge um número especificado (consulte a introdução do WebRequestManager abaixo). Se houver muitas solicitações a serem chamadas, as solicitações com prioridade média serão selecionadas para serem chamadas primeiro.
Para ativar o suporte integrado ao serviço Web de chamadas em lote do Atlas, primeiro você precisa registrar o manipulador do lado do servidor para processamento de chamadas em lote no web.config (o modelo de site padrão do Atlas habilitou esse manipulador):
<httpHandlers>
<add verbo="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validar="false"/>
</httpHandlers>
Em seguida, adicione a instrução display de WebRequestManager ao script Atlas XML da página e configure a página para permitir chamadas em lote para o serviço Web: <script type="text/xml-script">
<página xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<componentes>
<webRequestManager batchSize="5" enableBatching="true" batchDelay="3000" />
</componentes>
</página>
</script>
O que você precisa prestar atenção aqui são as três propriedades a seguir do WebRequestManager:
enableBatching: Defina se a página permite chamadas em lote. O valor padrão é falso. Aqui devemos defini-lo como verdadeiro.
batchSize: Defina o número máximo de solicitações incluídas em uma chamada em lote. O valor padrão é 5. Quando o número de solicitações a serem chamadas exceder esta configuração, a solicitação em lote será emitida imediatamente, mesmo que o limite de tempo definido em batchDelay não seja atingido.
batchDelay: Defina o limite de tempo de espera para uma chamada em lote. O valor padrão é 1000 (milissegundos). Quando o limite de tempo de espera exceder essa configuração, a solicitação em lote será emitida imediatamente, mesmo que o número de solicitações em batchSize não seja atingido.
Após esta configuração, as chamadas em lote serão aplicadas a cada solicitação de Web Service na página. Portanto, para uma única chamada, você deverá especificar sua prioridade como alta.
Vejamos um exemplo. Primeiro, escreva um Web Service, que possui o seguinte Método Web. Os dois parâmetros representam a ordem da tarefa (para que possamos distinguir a ordem de execução da tarefa) e a prioridade:
[WebMethod].
string pública DoTask(int taskID, int prioridade)
{
if (prioridade < 0 || prioridade > 2)
throw new Exception("a prioridade só pode ser 0, 1 ou 2!");
return string.Format("Tarefa (ID: {0}, Prioridade: {1}) concluída.", taskID, prioridade);
}
Em seguida, siga o código do início para habilitar chamadas em lote no web.config e adicione WebRequestManager à página. Não esqueça que um ScriptManager também é necessário na página para referenciar o Web Service definido acima: <atlas:ScriptManager ID=. "scriptManager" runat="servidor">
<Serviços>
<atlas:ServiceReference Path="SampleService.asmx" />
</Serviços>
</atlas:ScriptManager>
Adicione marcação HTML. O botão é usado para acionar chamadas em lote e o div é usado para exibir os resultados da chamada:
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invocaTasks_onclick()" />
<div id="resultado"/>
Por fim, existe o script JavaScript para chamar o Web Service:
function invocaTasks_onclick()
{
//limpa a saída
$('resultado').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
}
var taskID = 0;
função DoTask(tempos, prioridade)
{
for (var i = 0; i <vezes; ++i)
{
ExemploService.DoTask(
ID da tarefa++,
prioridade,
{onMethodComplete: OnComplete, prioridade: prioridade }
);
}
}
functionOnComplete(resultado)
{
$('resultado').innerHTML += resultado + "<br />";
}
Observe que o método DoTask() aceita dois parâmetros: times é usado para especificar o número de chamadas, prioridade é usada para especificar a prioridade e usamos uma variável global taskID para manter uma sequência de solicitação incremental.
Neste exemplo, invocamos primeiro uma solicitação de baixa prioridade, depois uma de média prioridade e, finalmente, duas de alta prioridade.
Como a alta prioridade não participa de chamadas em lote, a primeira coisa que você vê é o retorno delas:
Como o número total de prioridades médias e baixas é 2 e ainda não atingiu 5 , ele é enviado após um atraso de 3.000 milissegundos:
Você pode modificar a sequência de chamadas e o número de chamadas no método InvokeTasks_onclick() para analisar como as chamadas em lote são implementadas.
O programa de exemplo pode ser baixado aqui: