type - ¿Cuál es el mejor diseño en.NET para usar para enviar datos a través de una conexión de red no confiable(3G)?
wireless network connection (7)
¿Has mirado el Marco de sincronización ?
Espero que ayude, Bruno Figueiredo
Estoy rediseñando una aplicación que heredé que envía fotos digitales desde una computadora portátil a un servidor web. La idea es tomar fotos "en el campo" y publicarlas instantáneamente en una página web (con algunas características más sofisticadas).
Escenario típico
1. Las fotos se transfieren de la cámara a la computadora portátil con USB estándar.
2. Las fotos se procesan de varias maneras. (No importante)
3. Cada foto se PUBLICA en pequeños pedazos (~ 64 kb cada uno) utilizando una búsqueda webre en un servidor web Apache estándar donde se fusiona de nuevo.
El problema con el diseño actual es que a menudo se cuelga cuando la conexión de red no es confiable. Como estamos usando una red móvil (3G) y, a menudo, terminamos fuera de cobertura, necesito una forma de manejar esto correctamente.
Mi pregunta es si hay una mejor solución para hacer esto que no hará que la aplicación se cuelgue cuando la conexión se cae de vez en cuando.
(La pregunta adicional es cómo podría probarse esta unidad correctamente sin tener que ir de excursión con la computadora portátil).
EDITAR 2008-11-24: ahora he logrado establecer un entorno de prueba adecuado para esto usando una combinación de NetLimiter y TMnetsim (freeware). Intenté establecer 5 kb / seg y soltar el 1% de todos los paquetes; mi aplicación aún funciona bien con el nuevo diseño.
EDITAR 2008-12-11: Solo para actualizar cómo lo hice. Creé un trabajador de fondo (como se sugiere a continuación) que se inicia cada vez que se detecta una cámara para copiar las fotos de la cámara a la PC. Luego, comencé a trabajar en otro entorno cuando los archivos llegan a la PC para cargarlos mediante una transferencia HTTP asíncrona. Definitivamente fue un dolor hacer todo bien, especialmente porque la operación debería ser "cancelable" en cualquier momento ... Pero de todos modos, ahora funciona. ¡UN GRAN AGRADECIMIENTO a todos los que me ayudaron!
Primero averigüe por qué está colgado: ¿las solicitudes están ahí? ¿Se van a tiempo? ¿Qué sucede si reduces la configuración de tiempo de espera?
¿Estás haciendo el POST desde el hilo de UI? (No hagas eso :)
También es posible que detecte la caída de la conexión al hacer solicitudes de latido con tiempos de espera muy cortos.
Probablemente necesites usar WebRequest.BeginGetResponse en lugar de WebRequest.GetResponse, aunque parece que no hay manera de cancelar la respuesta (tal vez la eliminación de WebRequest sea útil).
Además, podría intentar jugar con la propiedad Timeout de WebRequest
Una forma de probar esto sin sacar su computadora portátil a los campos: pruebe m0n0wall en una máquina de repuesto y configure sus reglas de firewall para reducir el ancho de banda y soltar paquetes.
Alternativamente, instale netlimiter en su servidor / cliente
Evitaría usar HTTP en absoluto desde cualquier hilo que tenga UI a menos que realmente quieras bloquear hasta que se reciba la respuesta. Puede intentar usar la misma lógica de un hilo de fondo que se ejecutará todo el tiempo que lo necesite. Solo asegúrese de tener una lógica que detecte cuándo se pierde la conexión (probablemente a partir de un tiempo de espera) y la volverá a intentar a intervalos regulares (pero no frecuentes) hasta que vuelva a conectarse.
Su mejor opción sería crear algún tipo de proceso de trabajo en segundo plano que cargue las fotos una vez que se guarden en un directorio de Dropbox en el dispositivo. Aunque diré que crear un proceso en segundo plano basado en .NET no es trivial.
Intentaría utilizar las técnicas de almacenamiento en caché de ASP.NET con los servicios ADO.NET Sync para la transferencia de datos.
intente primero almacenar en caché las imágenes en un formato binario o BLOB y almacenarlas en una base de datos CE local (o Express). luego Sincronice los datos a una base de datos del servidor central, a través de WebServices.
Intente crear un servicio web centralizado para manejar sus transferencias de imágenes en caché.
El servicio web recibiría los datos a través de los servicios de sincronización en un escenario "conectado ocasionalmente".
para pruebas unitarias, intente usar una máquina virtual (VMware) o una computadora portátil en una conexión de acceso telefónico.