Скачивание большого двоичного объекта Azure по частям с помощью WCF

Меня попросили предоставить службу WCF, которая позволяет загружать большие двоичные объекты (потенциально 1 ГБ) по частям в качестве смещения byte[] для использования приложением Silverlight. По сути, операция будет иметь параметр для количества байтов для смещения и максимального количества байтов для возврата, я думаю, ничего сложного.

Код, который у меня есть до сих пор:

[OperationContract]
public byte[] Download(String url, int blobOffset, int bufferSize)
{
    var blob = new CloudBlob(url);

    using(var blobStream = blob.OpenRead())
    {
        var buffer = new byte[bufferSize];
        blobStream.Seek(blobOffset, SeekOrigin.Begin);
        int numBytesRead = blobStream.Read(buffer, 0, bufferSize);

        if (numBytesRead != bufferSize)
        {
            var trimmedBuffer = new byte[numBytesRead];
            Array.Copy(buffer, trimmedBuffer, numBytesRead);
            return trimmedBuffer;
        }
        return buffer;
    }
}

Я проверил это (хотя и с относительно небольшими файлами ‹ 2 МБ), и это работает, но у меня есть вопросы:

  • Может ли кто-нибудь предложить улучшения в коде?
  • Есть ли лучший подход с учетом требований?

person Digbyswift    schedule 05.02.2012    source источник


Ответы (1)


Вы можете вернуть большой двоичный объект в виде потока вместо массива байтов. Здесь есть пример кода в соответствующем вопросе: Возврат Azure BLOB из службы WCF в виде потока — нужно ли его закрывать?

Обратите внимание, что существуют некоторые ограничения на то, какие привязки вы можете использовать при возврате потока.

person Shiraz Bhaiji    schedule 05.02.2012
comment
Как уже упоминалось, требование состоит в том, чтобы возвращать большой двоичный объект в виде фрагментов byte[], а не потока. Или я неправильно понял, что вы имеете в виду? - person Digbyswift; 05.02.2012
comment
почему вам нужно использовать большой двоичный объект как массив байтов, а не как поток? - person Shiraz Bhaiji; 05.02.2012
comment
Я не. Мой клиент запросил это. Так что, по-видимому, у них уже есть решение, которое требует этого. Я могу только предположить, что они хотели бы иметь возможность загружать большие двоичные объекты по частям, не обязательно в одном и том же сеансе. - person Digbyswift; 05.02.2012