Azure Storage api不适用于asnyc上传

时间:2014-05-28 10:04:46

标签: asp.net-mvc asp.net-mvc-4 azure azure-storage azure-storage-blobs

我正在尝试通过Azure Blob Storage .NET api上传这么多文件,并使用当前的最新版本4.0.1。在ASP.NET MVC应用程序中,我使用异步操作方法通过await blobFile.UploadFromStreamAsync上传,但它确实无法工作,甚至我也没有看到异常。它在这种方法中默默地停止而没有成功。

但是,如果我将动作方法更改为非异步并通过blobFile.UploadFromStream方法上传,那么一切都运行良好。我可以通过异步方式上传,成功率为1%,这意味着稳定性非常低。

你经历过同样的事吗?是存储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);
        }
    }

1 个答案:

答案 0 :(得分:1)

代码片段看起来很好 - 虽然我不确定它周围的应用程序是做什么的。您是否打开服务器日志以查看服务器端发生了什么?对于大文件,您应该看到异步上传转换为几个PutBlocks然后转换为PutBlockList。如果您没有看到PutBlockList,那么您的应用程序中可能会发生一些奇怪的事情。

然后假设您确实看到服务器日志中的操作显然意味着正在进行操作。那时候看看E2ELatency数字和ServerLatency我认为你会发现E2Latency的差别很大,因为它结合了客户端所花费的时间 - 看看你的客户端网络是否会导致问题,这将会很有趣。例如,在我的连接上,第一个PutBlock的e2elatency为1346 ms,而ServerLatency为137。

有关日志记录的详细信息,请查看here

杰森