2009-12-06 15 views
5

Tengo una aplicación de Silverlight que necesita cargar archivos de gran tamaño al servidor. He visto cargar tanto con WebClient como con HttpWebRequest; sin embargo, no veo una forma obvia de transmitir la carga con ninguna de las dos opciones. Haga lo mismo con el tamaño de los archivos, cargue todo el contenido en la memoria antes de que la subida no sea razonable. ¿Es esto posible en Silverlight?Carga de transmisión de Silverlight

+0

+1 Una muy buena pregunta, desearía tener una buena respuesta. ¿Qué tan grande es un archivo estamos hablando? – AnthonyWJones

+0

Hay archivos wav que pueden ser de hasta más de 150+ megs – herbrandson

Respuesta

1

Podría elegir un enfoque de "fragmentación". La subida de archivos de Silverlight en CodePlex utiliza esta técnica:

http://www.codeplex.com/SilverlightFileUpld

Dado un tamaño de porción (por ejemplo, 10k, 20k, 100k, etc.), se puede dividir el archivo y enviar cada trozo en el servidor mediante un HTTP solicitud. El servidor deberá manejar cada fragmento y volver a ensamblar el archivo a medida que llegue cada fragmento. En un escenario de granja web cuando hay varios servidores web, tenga cuidado de no utilizar el sistema de archivos local en el servidor web para este enfoque.

+0

Cualquier idea sobre cómo conservar los "fragmentos" 'en el lado del servidor (por ejemplo, en WCF) y volver a montar? – atconway

+1

He usado dos técnicas: 1) guardar cada fragmento como un archivo en el sistema de archivos a medida que llega, luego volver a ensamblar los archivos en el orden correcto después de que se hayan escrito todos los fragmentos y 2) guardar cada fragmento como datos binarios en una base de datos y luego vuelva a armar. Tendrá que utilizar la técnica n. ° 2 o un sistema de archivos distribuidos de algún tipo si su sitio se está equilibrando de carga en más de un servidor web. – kindohm

+0

Como la ubicación de mi sistema de archivos reside en el mismo servidor donde el servidor WCF existe y es * no * un servidor de carga equilibrada, creo que # 1 funcionará muy bien. ¿Tiene algún ejemplo de cómo escribir los trozos y volver a ensamblar? ¿Qué tipo de lector/escritor usarías? Gracias por la ayuda. – atconway

1

Parece extraordinario que WebClient en Silverlight no proporcione un medio para bombear un flujo al servidor con eventos de progreso. Es especialmente sorprendente ya que esto se ofrece para una carga de cadenas.

Es posible codificar lo que parece estar haciendo lo que desea con HttpWebRequest.

En la devolución de llamada para BeginGetRequestStream puede obtener el flujo para la solicitud saliente y luego leer los fragmentos de la secuencia de su archivo y escribirlos en la secuencia de salida. Desafortunadamente, Silverlight no comienza a enviar la salida al servidor hasta que se cierra la secuencia de salida. Donde todos estos datos terminan siendo almacenados mientras tanto, no sé, es posible que si se vuelve lo suficientemente grande, SL podría usar un archivo temporal para no estresar la memoria de la máquina, pero de nuevo podría almacenarlo todo en la memoria de todas formas.

La única solución que esto podría ser posible es escribir el protocolo HTTP a través de sockets.

+0

Averigüe un poco sobre los sockets y el problema es que los conectores Silverlight no se pueden conectar al puerto 80 (solo 4502 a 4534) – herbrandson

Cuestiones relacionadas