使用BeginUploadFromStream时,Blob不存在

时间:2011-12-14 01:40:24

标签: azure azure-storage-blobs

在我使用CloudBlob.BeginUploadFromStream()方法上传文件后,我稍后在尝试检索文件以进行下载时,使用StorageErrorCode.ResourceNotFound获取StorageClientException。如果我使用CloudBlob.UploadFromStream()方法上传相同的文件,那么blob DOES存在,我可以下载它。

这是我的下载代码:

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!");
}

存在是一种扩展方法。当我使用BeginUploadFromStream()方法时,我收到带有错误代码ResourceNotFound的StorageClientException

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()方法会使用msg WebException抛出"The request was aborted: The request was canceled." InnerException"Cannot close stream until all bytes are written."

任何人都知道这里发生了什么?

2 个答案:

答案 0 :(得分:2)

BeginUploadFromStream异步上传blob,因此当blob在后台线程上传时,您的方法会继续。如果blob尚未完成上传 - 或者如果Azure尚未被告知上传已完成 - 您将无法在存储中看到blob。只有通过成功完成的交易上传的blob才可见。

您可以发布OnUploadCompleted的代码吗?

首先看一眼blob是否仍在上传 - 或者您忘记在EndUploadFromStream()方法中调用OnUploadCompleted

答案 1 :(得分:0)

听起来似乎正在发生的是IIS正在取消正在启动的线程以生成BeginUploadFromStream。由于存储API实际上只是在操作一堆REST调用,您可以将这些存储调用视为Web服务调用,而不是传统的IO。

在HttpKeepAlives上查看此主题,这可能会解决您的问题,但正如文章所指出的那样,它可能会影响您网站的性能。因此,您可能希望添加逻辑以仅为正在执行上载的请求启用保持活动状态。

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