Отличный вопрос! Я считаю, что проблема заключается в том, как реализован метод CommitBlockList
. Я проверил запрос / ответ в Fiddler, и это то, что отправляется в службу хранения:
<BlockList>
<Uncommitted>MA==</Uncommitted>
<Uncommitted>MQ==</Uncommitted>
</BlockList>
Если вы заметили, что хотя блок с MA==
идентификатором блока был зафиксирован, SDK все еще отправляет его как Uncommitted
и это вызывает проблему.
Затем я посмотрел документацию этого метода here
, и это то, что я заметил для параметра base64BlockIds
:
Укажите Uncommitted Идентификаторы закодированных в Base64 , чтобы указать, что служба BLOB-объектов должна искать только в списке незафиксированных блоков для именованных блоков. Если блок не найден в списке незафиксированных блоков, он не будет записан как часть большого двоичного объекта, и будет выдано исключение RequestFailedException.
Поскольку блок с MA==
идентификатором блока уже существует зафиксировано, и вы отправляете его как незафиксированный блок, служба хранения выдает исключение.
ИМХО, реализация метода не соответствует операции Put Block List
REST API. SDK следует изменить, чтобы учесть этот сценарий, учитывая, что это вполне возможно сделать с помощью REST API. Я бы порекомендовал открыть для этого вопрос на SDK Repository
.