ajax - utilizan - indices para medir el desarrollo de un pais
¿Cómo se mide el progreso de una llamada al servicio web? (6)
Creo que el servicio web XML es lento, por lo que crear múltiples métodos y sondear el progreso será extremadamente lento y generará una enorme carga en el servidor. No lo haría en el entorno de producción. Veo los mismos (pero más pequeños) problemas con el sondeo de la base de datos.
Pruebe las extensiones SOAP en su lugar. Implementa un modelo impulsado por eventos. Consulte Agregar una barra de progreso a su aplicación de cliente de servicio web en MSDN .
Tengo un servicio web ASP.NET que hace algunas tareas pesadas, como por ejemplo, algunas operaciones de archivos, o genera hojas de Excel de un montón de informes de cristal. No deseo que me bloqueen llamando a este servicio web, por lo que quiero que el servicio web se llame de manera asíncrona. Además, quiero llamar a este servicio web desde una página web, y quiero algún mecanismo que me permita seguir sondeando el servidor para que pueda mostrar algún indicador de progreso en la pantalla, como por ejemplo, el número de archivos que han sido procesados Tenga en cuenta que no quiero una notificación al completar la llamada al método web, sino que quiero un estado de progreso en vivo. ¿Cómo lo hago?
Escriba un método por separado en el servidor que pueda consultar pasando el ID del trabajo que se ha programado y que arroja un valor aproximado entre 0-100 (o 0.0 y 1.0, o lo que sea) de cuán avanzado está.
Por ejemplo, en estilo REST, podría hacer una solicitud GET a http://yourserver.com/app/jobstatus/4133/
que devolvería un simple ''52'' como text/plain
. Entonces solo tienes que consultarlo cada (segundo? Dos segundos? Diez segundos?) Para ver qué tan avanzado está.
La forma en que realmente se lleva a cabo la supervisión en el back-end depende en gran medida de cuál es su proceso y cómo funciona.
Haga que el servicio web devuelva algún tipo de ID de tarea o ID de sesión. Cree otro método web para consultar con esa ID, que devuelve la información necesaria (% de compleción, lista de archivos, lo que sea). Encuesta este método en algún intervalo del cliente.
Use una base de datos para almacenar la información del proceso, si hace esto en la memoria del servicio web, esto no se escalará bien en el entorno de granja de servidores web, ya que puede suceder que la tarea se ejecute en otro servidor que el que está sondeando.
EDITAR: Acabo de ver otra respuesta similar y comentar sobre ella. El comentador está en lo cierto: puede usar la tabla en memoria para evitar las operaciones de disco, pero aún así usar un servidor de db por separado.
Haga que la llamada inicial al servicio web de "inicio de generación de informes" cree una tarea en un grupo de tareas y devuelva a la persona que llama el ID de la tarea.
Luego, proporcione otro método que devuelva el "porcentaje realizado" para un identificador de tarea determinado.
Proporcione un tercer método que devuelva el resultado real de una tarea completada.
La manera más fácil sería hacer que el servicio web actualice un campo en una base de datos con el progreso de la llamada, y luego crear un servicio web que consulte ese campo y devuelva el valor.
También puede usar SoapExtensions para notificar a su cliente del progreso de la descarga / proceso. El servidor puede enviar eventos al cliente. No debe cambiar nada en el cliente si no lo usa.
Permite algo como esto en tu cliente:
//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...
private void ProgressUpdate(object sender, ProgressEventArgs e)
{
double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
//Show Progress...
}