【发布时间】:2014-07-17 11:57:43
【问题描述】:
我正在尝试通过 Azure Blob Storage .NET api 上传这么多文件,并与当前最新版本 4.0.1 一起使用。在 ASP.NET MVC 应用程序中,我使用异步操作方法通过 await blobFile.UploadFromStreamAsync 上传,但它确实不起作用,甚至我没有看到异常。它在没有成功的情况下默默地停止。
但是,如果我将操作方法更改为非异步并通过 blobFile.UploadFromStream 方法上传,那么一切正常。我可能会以 1% 的成功率通过异步方式上传,这意味着稳定性非常低。
你有同样的经历吗?是 Storage Api 实现中的错误吗?
这是一个简短的例子。一种是异步的,另一种是非异步操作方法。如果我上传小文件没有任何问题,但在大下载时出现问题。在这个例子中 UploadBlobSec 方法上传时间很短,但 UploadBlob 需要无限时间。
public async Task UploadBlob()
{
var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference("files");
var blobFile = blobContainer.GetBlockBlobReference("song.mp3");
using (var stream = new WebClient().OpenRead("http://apolyonstorage.blob.core.windows.net/files/e8b1a1fa-8791-44dc-92ce-1a67a62f7b0f.mp3"))
{
await blobFile.UploadFromStreamAsync(stream);
}
}
public void UploadBlobSec()
{
var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference("files");
var blobFile = blobContainer.GetBlockBlobReference("song.mp3");
using (var stream = new WebClient().OpenRead("http://apolyonstorage.blob.core.windows.net/files/e8b1a1fa-8791-44dc-92ce-1a67a62f7b0f.mp3"))
{
blobFile.UploadFromStream(stream);
}
}
【问题讨论】:
-
@usr 你不能确定这一点。我与我自己的代码无关。如果我不喜欢异步上传,一切正常。
-
拜托,我是经验丰富的开发人员,我不会怀疑这可能是 api 中的错误。我不认为数千名开发人员使用的异步上传方式。它比你想象的要少得多。
-
我很快就会在这里提供经过简化和测试的示例。
-
@usr 如果你有时间,你能测试一下这个例子吗?我相信你会遇到同样的问题。
-
代码看起来不错。这所有是怎么回事?也许调用者正在对
UploadBlob返回的任务调用Wait。这是一种常见的僵局情况。该问题是否在带有异步控制器的全新、几乎为空的 ASP.NET MVC 应用程序中重现?如果是,那确实看起来像一个错误。但我认为不会,因为这意味着这种方法 100% 不可用。那早就找到了。
标签: asp.net-mvc asp.net-mvc-4 azure azure-storage azure-blob-storage