Autor: Dflying Chen ( http://dflying.cnblog.som/ )
Para el programa Atlas, en algunos casos, necesitamos llamar a una gran cantidad de servicios web en poco tiempo, como los usuarios de una lista que hacen clic rápidamente para eliminar. . En este momento, el ancho de banda de la red, la estabilidad, etc., a menudo provocarán retrasos más prolongados. Si estas llamadas se pueden empaquetar en una sola solicitud, los usuarios solo necesitan soportar un retraso de red para obtener los resultados del procesamiento, lo que también mejora indirectamente la eficiencia. Parece que esta no es una función fácil de implementar, pero afortunadamente, Atlas tiene soporte integrado para llamadas por lotes a servicios web. Todo lo que necesita es una configuración simple en el programa.
Cada solicitud de llamada de servicio web en Atlas tiene tres prioridades: 0: alta, 1: media, 2: baja y el valor predeterminado es medio.
Al llamar, puede especificar la prioridad de esta llamada a través del parámetro de prioridad (consulte: Llamada al servicio web en ASP.NET Atlas: manejo de errores, tiempos de espera y respuesta a operaciones de cancelación de usuario). Para llamadas de alta prioridad, Atlas no aplica llamadas por lotes y enviará la solicitud inmediatamente cada vez. Para llamadas de prioridad media y baja, Atlas finalizará las llamadas dentro de un cierto período de tiempo (consulte la introducción de WebRequestManager a continuación; ) en uno Las solicitudes individuales se envían juntas, o cuando el número de solicitudes a llamar alcanza un número específico (consulte la introducción de WebRequestManager a continuación). Si hay demasiadas solicitudes para llamar, las solicitudes con prioridad media se seleccionarán para llamar primero.
Para habilitar el soporte del servicio web de llamadas por lotes integrado de Atlas, primero debe registrar el controlador del lado del servidor para el procesamiento de llamadas por lotes en web.config (la plantilla predeterminada del sitio web de Atlas ha habilitado este controlador):
<httpHandlers>
<agregar verbo="*" ruta="atlasbatchcall.axd" tipo="Microsoft.Web.Services.MultiRequestHandler" validar="false"/>
</httpHandlers>
Luego agregue la declaración de visualización de WebRequestManager al script Atlas XML de la página y configure la página para permitir llamadas por lotes al servicio web: <script type="text/xml-script">
<página xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<componentes>
<webRequestManager tamaño de lote="5" enableBatching="true" loteDelay="3000" />
</componentes>
</página>
</script>
A lo que debe prestar atención aquí son las siguientes tres propiedades de WebRequestManager:
enableBatching: establezca si la página permite llamadas por lotes. El valor predeterminado es falso. Aquí deberíamos establecerlo en verdadero.
tamaño de lote: establezca el número máximo de solicitudes incluidas en una llamada por lotes. El valor predeterminado es 5. Cuando el número de solicitudes a llamar excede esta configuración, la solicitud por lotes se emitirá inmediatamente incluso si no se alcanza el límite de tiempo establecido en BatchDelay.
BatchDelay: establece el límite de tiempo de espera para una llamada por lotes. El valor predeterminado es 1000 (milisegundos). Cuando el límite de tiempo de espera excede esta configuración, la solicitud por lotes se emitirá inmediatamente incluso si no se alcanza la cantidad de solicitudes en el tamaño del lote.
Después de esta configuración, se aplicarán llamadas por lotes a cada solicitud de servicio web en la página. Por lo tanto, para una sola llamada, debes especificar su prioridad como alta.
Veamos un ejemplo. Primero, escriba un servicio web, que tenga el siguiente método web. Los dos parámetros representan el orden de la tarea (para que podamos distinguir el orden de ejecución de la tarea) y la prioridad:
[WebMethod].
cadena pública DoTask(int taskID, int prioridad)
{
si (prioridad < 0 || prioridad > 2)
lanzar una nueva excepción ("¡la prioridad solo puede ser 0, 1 o 2!");
return string.Format("Tarea (ID: {0}, Prioridad: {1}) finalizada.", taskID, prioridad);
}
Luego siga el código al principio para habilitar llamadas por lotes en web.config y agregue WebRequestManager a la página. No olvide que también se necesita un ScriptManager en la página para hacer referencia al servicio web definido anteriormente: <atlas:ScriptManager ID=. "scriptManager" runat="servidor">
<Servicios>
<atlas:ServiceReference Path="SampleService.asmx" />
</Servicios>
</atlas:ScriptManager>
Agregue marcado HTML. El botón se usa para activar llamadas por lotes y el div se usa para mostrar los resultados de la llamada:
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="resultado"/>
Finalmente, está el script JavaScript para llamar al Servicio Web:
función invokeTasks_onclick()
{
// borrar la salida
$('resultado').innerHTML = '';
Realizar tarea(1, 2);
Realizar tarea(1, 1);
Realizar tarea(2, 0);
}
var ID de tarea = 0;
función DoTask(tiempos, prioridad)
{
para (var i = 0; i < veces; ++i)
{
SampleService.DoTask(
ID de tarea ++,
prioridad,
{onMethodComplete: OnComplete, prioridad: prioridad}
);
}
}
funciónOnComplete(resultado)
{
$('resultado').innerHTML += resultado + "<br />";
}
Observe que el método DoTask() acepta dos parámetros: los tiempos se usan para especificar el número de llamadas, la prioridad se usa para especificar la prioridad y usamos una variable global taskID para mantener una secuencia de solicitud incremental.
En este ejemplo, primero invocamos una solicitud de prioridad baja, luego una de prioridad media y finalmente dos de prioridad alta.
Dado que la alta prioridad no participa en las llamadas por lotes, lo primero que ve es su devolución:
Dado que el número total de prioridades medias y bajas es 2 y aún no ha llegado a 5 , se envía después de un retraso de 3000 milisegundos:
Puede modificar la secuencia de llamadas y la cantidad de llamadas en el método invokeTasks_onclick() para analizar cómo se implementan las llamadas por lotes.
El programa de muestra se puede descargar aquí: