¿Cómo puedo saber en el lado del cliente cuando el manejador HTTP ha terminado de procesarse?

StackOverflow https://stackoverflow.com/questions/152618

  •  02-07-2019
  •  | 
  •  

Pregunta

Probablemente sea una pregunta larga para una solución simple, pero aquí va ...

Tengo un control de Silverlight personalizado para seleccionar varios archivos y enviarlos al servidor. Envía archivos a un controlador general (FileReciever.ashx) usando el método OpenWriteAsync de un control WebCLient.

Básicamente, el código de Silverlight hace algo como esto para cada archivo:

WebClient client = new WebClient();
client.OpenWriteCompleted += (sender, e) =>
  {
    PushData(data, e.Result);
    e.Result.Close();
    data.Close();
  };
client.OpenWriteAsync(handlerUri); 

El controlador del lado del servidor simplemente lee la secuencia entrante y luego procesa un poco más con la matriz de bytes resultante.

EL PROBLEMA es que OpenWriteCompleted del lado del cliente se realiza tan pronto como todos los datos se envían por cable. Mi código continuará con el siguiente archivo. Lo que realmente quiero es esperar hasta que el controlador ASHX haya terminado con todo el procesamiento de esa solicitud. ¿Cómo puedo hacer eso? ¿Algún mecanismo de espera en WebClient? ¿Alguna devolución de llamada que pueda hacer en el HttpContext en el controlador? ¿Debo usar algún otro tipo de técnica de transferencia? Por favor consejo!

¿Fue útil?

Solución

Hrm, tal vez una solución simple podría ser etiquetar la url con un GUID (el guid es único por archivo, o transferencia, lo que tenga sentido para su situación). Luego, puede tener otro servicio web simple que sea capaz de verificar el estado del otro servicio, basado en el guid, y que su cliente de Silverlight solicite al nuevo servicio su estado de procesamiento (al pasar al nuevo servicio web el guid del transferencia pasada).

Otros consejos

La misma pregunta se ha formulado en Silverlight foros . La respuesta aprobada por Microsoft fue que no se puede hacer eso con WebClient y OpenWriteAsync. Necesitas al usuario UploadStringAsync o a HttpWebRequest.

Supongo que le preocupa que los datos que se devuelven desde el controlador tardan mucho tiempo en transferirse y que el servidor no se esté utilizando durante ese tiempo. No hay una manera de saber cuándo el servidor ha terminado de procesarse, por lo que no creo que pueda hacerlo sin cambiar su arquitectura.

Tendría a su controlador solo un identificador de algún tipo (como un GUID o int) que se puede usar para recuperar el resultado del controlador en otra solicitud. Así que la página llamaría al manejador, el manejador almacenaría el resultado y devolvería el identificador, la página llamaría al manejador por segunda vez y llamaría a otro manejador para obtener el resultado de la primera llamada. Esto mantendría su servidor en uso mientras se transferían sus datos.

O probablemente puedes hacerlo con JavaScript (jQuery) ... si no te importa usar JavaScript, es decir.

Si los archivos no son muy grandes y es posible mantenerlos en la memoria, una solución fea pero efectiva es convertirlos en cadenas y enviarlos utilizando el método UploadStringAsync.

Evite este enfoque si el tamaño del archivo no tiene límites, pero si ahora puede ser relativamente pequeño, es posible usar este enfoque.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top