В настоящее время я разрабатываю сервис, в котором клиент общается с сервером, отправляя XML-файлы с сообщениями. Чтобы повысить надежность обмена сообщениями (клиент будет использовать низкокачественный мобильный интернет с ограниченной полосой пропускания), я разбиваю эти сообщения на более мелкие части размером 64 или 128 КБ и отправляю их с помощью transfer="streamed" в привязке BasicHttp.
Теперь у меня есть проблема: сервер должен сообщить клиенту, успешно ли он получил блок или нет, поэтому после того, как 5 блоков не удалось передать, процесс передачи будет отменен и отложен, чтобы попробовать позже, и отслеживать, какие чанки принимаются, а какие нет.
Я думаю об использовании механизма обратного вызова для связи с клиентом, поэтому сервер будет вызывать метод обратного вызова ChunkReceived в своем [OperationContract], когда он сохраняет фрагмент в файл на стороне сервера, но поправьте меня, если я ошибаюсь, но обратный вызов работает только с привязкой WS Dual http и не поддерживается при привязке basichttp. Но потоковая передача не поддерживается привязкой WS Dual.
Итак, могу ли я переключиться на двойную привязку WS и использовать transfer="buffered" (учитывая, что размер фрагмента относительно мал) - не повредит ли это надежности передачи? Или, может быть, я могу как-то общаться с клиентом в базовой привязке http, может быть, возвращая какое-то ответное сообщение, т.е.
[OperationContract]
ServerResponse SendChunk (Chunk chunk);
где ServerResponse будет содержать некоторый флаг enum или bool, чтобы сообщить клиенту, в порядке ли операция SendChunk. Но тогда мне придется хранить какой-то массив как на стороне клиента, так и на стороне сервера, чтобы отслеживать состояние всех фрагментов. Я просто не уверен, какой шаблон лучше всего использовать там. Любые советы будут высоко оценены.