Какой лучший дизайн в .NET использовать для отправки данных по ненадежному (3G) сетевому соединению?

Я перепроектирую приложение, которое унаследовал, которое отправляет цифровые фотографии с ноутбука на веб-сервер. Идея состоит в том, чтобы сфотографировать "на поле" и мгновенно опубликовать их на веб-странице (с некоторыми более привлекательными функциями).

Типичный сценарий
1. Фотографии переносятся с камеры на ноутбук с помощью стандартного USB.
2. Фотографии обрабатываются различными способами. (Не важно)
3. Каждая фотография отправляется небольшими частями (~ 64 кб каждая), используя веб-запрос на стандартный веб-сервер Apache, где он снова объединяется.

Проблема с текущим дизайном заключается в том, что он часто зависает, когда сетевое соединение ненадежно. Поскольку мы используем мобильную сеть (3G) и часто оказываемся вне зоны покрытия, мне нужен способ справиться с этим должным образом.

Мой вопрос заключается в том, есть ли лучшее решение для этого, которое не приведет к зависанию приложения, когда соединение время от времени падает.

(Бонусный вопрос заключается в том, как это можно было бы правильно протестировать, без необходимости совершать походы с ноутбуком.)

EDIT 2008-11-24: Теперь мне удалось создать подходящую тестовую среду для этого, используя комбинацию NetLimiter и TMnetsim (freeware). Я попытался установить 5 кб/с и сбросил 1% всех пакетов - мое приложение все еще хорошо работает с новым дизайном.

EDIT 2008-12-11: Просто обновить, как я это сделал. Я создал одного фонового работника (как предложено ниже), который запускается всякий раз, когда обнаружена камера для копирования фотографий с камеры на ПК. Затем другой фоновой рабочий я начал, когда файлы поступают на ПК для загрузки с использованием асинхронной передачи HTTP. Конечно, было боль, чтобы все исправить, тем более, что операция должна быть "отменена" в любое время... Но так или иначе, теперь это работает. Большой СПАСИБО всем, кто помог мне!

Ответ 1

Я бы вообще избегал использования HTTP из любого потока с пользовательским интерфейсом, если вы действительно не хотите блокировать до получения ответа. Вы можете попробовать использовать ту же логику из фонового потока, который будет работать столько, сколько нужно. Просто убедитесь, что у вас есть логика, которая обнаружит, когда соединение потеряно (возможно, с тайм-аутом), и повторите попытку в обычном (но не частом) интервале до повторного подключения.

Лучше всего создать какой-то фоновый рабочий процесс, который будет загружать фотографии после их сохранения в директорию dropbox на устройстве. Я скажу, что создание фонового процесса на основе .NET не является тривиальным.

Ответ 2

Сначала выясните, почему он висит - это запросы, которые просто сидят там? Они тайм-аут? Что произойдет, если вы снизите настройку таймаута?

Вы делаете POST из потока пользовательского интерфейса? (Не делайте этого:)

Вы можете обнаружить падение соединения, сделав запросы на сердцебиение с очень короткими таймаутами.

Ответ 3

Вероятно, вам нужно использовать WebRequest.BeginGetResponse вместо WebRequest.GetResponse, хотя, похоже, не существует способа отменить ответ (возможно, избавление от WebRequest поможет).

Кроме того, вы можете попробовать играть с Timeout свойство WebRequest

Ответ 4

Способ проверить это, не вынимая ноутбук в полях: попробуйте m0n0wall на резервной машине и настройте свои правила брандмауэра, чтобы сжать полосу пропускания и отбросить пакеты.

В качестве альтернативы установите netlimiter на свой сервер/клиент

Ответ 5

Во-первых, я бы поставил процесс передачи за пределы приложения. Синхронизировать файлы с помощью утилиты, которая позволяет перезагрузить передачу с середины последней передачи.

Вы можете имитировать падение связи с помощью некоторого типа клетка Faraday.

Ответ 6

Вы просмотрели Sync Framework?

Надеюсь, что это поможет, Бруно Фигейредо [/p >

Ответ 7

Я бы попытался использовать методы кэширования ASP.NET с помощью служб ADO.NET Sync для передачи данных.

сначала попробуйте кэшировать изображения в двоичный или BLOB-формат и хранить их в локальной базе данных CE (или Express). затем синхронизировать данные с базой данных центрального сервера через WebServices.

Попробуйте создать централизованный веб-сервис для обработки ваших кэшированных передач изображений.

Веб-служба получит данные через службы синхронизации в сценарии "случайно подключенного".

для модульного тестирования, попробуйте использовать виртуальную машину (VMware) или ноутбук в режиме коммутируемого доступа.