Este es un problema que he estado investigando en la última semana y no puedo encontrar ninguna solución. Publicaciones encontradas pidiendo lo mismo pero nunca obteniendo una respuesta, con suerte esto ayudará a otros también.¿Cómo abortar una secuencia del servicio WCF sin leerla hasta el final?
Tengo un servicio WCF
que devuelve un objeto que contiene un stream
dentro de él. Uso basicHttpBinding
con transferencia de transmisión y Mtom para enviarlo al cliente.
El cliente llama al servicio WCF
y cierra el proxy inmediatamente después de recibir el objeto de respuesta.
A continuación, el cliente lee la secuencia que obtuvo del servicio WCF y la escribe en un archivo en el disco local. Todo esto funciona bien.
Mi problema es cuando el cliente quiere abortar la operación y dejar de descargar los datos del servicio WCF. Si llamo al .close()
en la transmisión, por ejemplo: serverReply.DataStream.Close();
, entonces bloquea y lee todo el flujo del servicio WCF hasta su finalización antes de continuar. La transmisión puede ser bastante grande y la red no siempre es rápida.
Esto es muy indeseable para el uso de ambos recursos de red, que básicamente se desperdicia en datos que ya no tienen uso. Y dado que basicHttpBinding
permite solo dos conexiones TCP simultáneas (de manera predeterminada) al servidor de servicio WCF, bloquea otros intentos de conexión hasta que la transmisión se lee hasta el final.
Podría aumentar el número de conexiones simultáneas, pero sería una mala solución, ya que crearía una abertura para problemas.
Por ejemplo, 20 descargas abortadas que aún están descargando los datos para descartarlos. Necesito hacer que la transferencia se detenga por completo.
En el cliente, el objeto de secuencia es solo una clase normal Stream
, por lo que solo tiene el método de cierre, nada más.
Llamar a .close()
o .abort()
en el objeto proxy no ayuda, tampoco lo destruye usando .dispose()
o cualquier otro método. En el lado del servidor, manejo el evento OperationContext.OperationCompleted
, pero no se activa hasta que los datos del stream
se leen hasta el final.
Entonces la pregunta es, ¿cómo cierro/aborto la secuencia sin leerla por completo?
¿Alguna suerte con esto? – Schultz9999
Sufriendo el mismo problema al enviar archivos realmente grandes ... parece que debe faltar algo realmente obvio. probablemente tenga que implementar fragmentación como una solución alternativa. –