在我使用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."
任何人都知道这里发生了什么?
答案 0 :(得分:2)
BeginUploadFromStream
异步上传blob,因此当blob在后台线程上传时,您的方法会继续。如果blob尚未完成上传 - 或者如果Azure尚未被告知上传已完成 - 您将无法在存储中看到blob。只有通过成功完成的交易上传的blob才可见。
您可以发布OnUploadCompleted
的代码吗?
首先看一眼blob是否仍在上传 - 或者您忘记在EndUploadFromStream()
方法中调用OnUploadCompleted
。
答案 1 :(得分:0)
听起来似乎正在发生的是IIS正在取消正在启动的线程以生成BeginUploadFromStream。由于存储API实际上只是在操作一堆REST调用,您可以将这些存储调用视为Web服务调用,而不是传统的IO。
在HttpKeepAlives上查看此主题,这可能会解决您的问题,但正如文章所指出的那样,它可能会影响您网站的性能。因此,您可能希望添加逻辑以仅为正在执行上载的请求启用保持活动状态。