Какой лучший дизайн в .NET можно использовать для отправки данных через ненадежное (3G) сетевое соединение? - PullRequest
10 голосов
/ 11 ноября 2008

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

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

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

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

(Бонус в том, как это можно правильно проверить на модуле, не прогуливаясь с ноутбуком.)

РЕДАКТИРОВАТЬ 2008-11-24: Теперь мне удалось настроить подходящую среду тестирования для этого, используя комбинацию NetLimiter и TMnetsim (бесплатное программное обеспечение). Я попытался установить 5 кбит / с и сбросить 1% всех пакетов - мое приложение все еще хорошо работает с новым дизайном.

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

Ответы [ 7 ]

2 голосов
/ 30 ноября 2008

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

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

1 голос
/ 11 ноября 2008

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

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

1 голос
/ 11 ноября 2008

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

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

1 голос
/ 11 ноября 2008

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

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

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

0 голосов
/ 01 декабря 2008

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

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

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

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

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

0 голосов
/ 11 ноября 2008

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

Надеюсь, это поможет, Bruno Figueiredo

0 голосов
/ 11 ноября 2008

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

Вы можете симулировать потери связи с каким-либо типом клетки Фарадея .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...