Загрузка большого двоичного объекта Azure с использованием WCF - PullRequest
0 голосов
/ 05 февраля 2012

Меня попросили предоставить службу 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 МБ), и оно работает, но мои вопросы: </p>

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

Ответы [ 2 ]

2 голосов
/ 20 февраля 2014
                    using (BlobStream blobStream = blob.OpenRead())
                    {
                        bool getSuccess = false;
                        int getTries = 0;
                        rawBytes = new byte[blobStream.Length];
                        blobStream.Seek(0, SeekOrigin.Begin);
                        int blockSize = 4194304; //Start at 4 mb per batch
                        int index = 0;
                        int documentSize = rawBytes.Length;
                        while (getTries <= 10 && !getSuccess)
                        {
                            try
                            {
                                int batchSize = blockSize;
                                while (index < documentSize)
                                {
                                    if ((index + batchSize) > documentSize)
                                        batchSize = documentSize - index;
                                    blobStream.Read(rawBytes, index, batchSize);
                                    index += batchSize;
                                }
                                getSuccess = true;
                            }
                            catch (Exception e)
                            {
                                if (getTries > 9)
                                    throw e;
                                else
                                    blockSize = blockSize / 2; // Reduce by half for each attempt
                            }
                            finally
                            { getTries++; }
                        }
                    }
0 голосов
/ 05 февраля 2012

Вы можете вернуть BLOB-объект в виде потока вместо байтового массива. Вот пример кода в связанном вопросе: Возвращение BLOB-объекта Azure из службы WCF в виде потока. Нужно ли его закрывать?

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

...