Blob не существует при использовании BeginUploadFromStream - PullRequest
1 голос
/ 14 декабря 2011

После того, как я использую метод CloudBlob.BeginUploadFromStream () для загрузки файла, я позже получаю исключение StorageClientException с StorageErrorCode.ResourceNotFound при попытке извлечь файл для загрузки.Если я загружаю тот же файл, используя метод CloudBlob.UploadFromStream (), то блоб СУЩЕСТВУЕТ, и я могу его скачать.

вот мой код загрузки:

var client = _storageAccount.CreateCloudBlobClient();

var container = client.GetContainerReference(BLOB_CONTAINER_DOCUMENTS_ADDRESS);
container.CreateIfNotExist();

string blobName = id.ToString();

var newBlob = container.GetBlobReference(blobName);
if (newBlob.Exists())
{
    var stream = newBlob.OpenRead();
    return stream;
}
else
{

    throw new Exception("Blob does not exist!");
}

Exists - это метод расширения,Я получаю StorageClientException с кодом ошибки ResourceNotFound при использовании метода BeginUploadFromStream ()

public static bool Exists(this CloudBlob blob)
{
    try
    {
        blob.FetchAttributes();
        return true;
    }
    catch (StorageClientException e)
    {
        if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
        {
            return false;
        }
        else
        {
            throw;
        }
    }
}

И мой вызов для загрузки

var blob = container.GetBlobReference(blobName);

Это НЕ вызовет исключение, когда япозже проверьте, существует ли BLOB-объект

blob.UploadFromStream(fileStream);

Это будет

AsyncCallback uploadCompleted = new AsyncCallback(OnUploadCompleted);
blob.BeginUploadFromStream(fileStream, uploadCompleted, documentId);

РЕДАКТИРОВАТЬ

Как и предполагалось, у меня не было звонкаEndUploadFromStream() метод.Вот мой обновленный вызов для загрузки:

blob.BeginUploadFromStream(fileStream, uploadCompleted, blob);

И мой обработчик

private void OnUploadCompleted(IAsyncResult result)
{
   var blob = (CloudBlob) result.AsyncState;
   blob.EndUploadFromStream(result);
}

При выполнении этого метода EndUploadFromStream() выдает WebException с сообщением: "The request was aborted: The request was canceled."InnerException это "Cannot close stream until all bytes are written."

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

BeginUploadFromStream загружает большой двоичный объект асинхронно, поэтому ваш метод продолжается, пока большой двоичный объект загружается в поток в фоновом режиме. Если BLOB-объект не завершил загрузку - или если Azure не сообщили, что загрузка завершена - вы не увидите этот BLOB-объект в хранилище. Видны только большие двоичные объекты, загруженные через успешно завершенные транзакции.

Не могли бы вы опубликовать код для OnUploadCompleted?

На первый взгляд все выглядит так, как будто BLOB-объект все еще загружается - или вы забыли вызвать EndUploadFromStream() в своем методе OnUploadCompleted.

0 голосов
/ 20 декабря 2011

Звучит так, как будто IIS отменяет поток, инициируемый для создания BeginUploadFromStream. Поскольку API хранилища на самом деле просто манипулирует множеством вызовов REST изнутри, вы можете рассматривать эти вызовы хранилища как вызовы веб-служб, а не как традиционные операции ввода-вывода.

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

http://www.jaxidian.org/update/2007/05/05/8/

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